Я понял это после прочтения документа API Mailchimp . Я должен добавить еще два поля email_address
и status
, которые являются обязательными. Затем переместите остальные поля формы в merge_fields
.
Правильный код:
const Mailchimp = require('mailchimp-api-v3');
const mailchimp = new Mailchimp(myMailchimpAPI);
mailchimp.post(`/lists/${myListId}/members`, {
email_address: 'jack@example.com',
status: 'subscribed',
merge_fields: {
FNAME: 'Jack',
EMAIL: 'jack@example.com',
COMPANY: 'Apple'
}
})
.then(res => console.log(res))
.catch(err => console.log(err));
Мне было трудно найти простую демоверсию в Интернете. Надеюсь, это поможет будущим людям.
Код:
char *p = new char[200];
p[100] = '\0';
delete[] p;
идеально подходит для C ++. delete не знает или не заботится о строках с нулевым символом в конце, поэтому ваша ошибка должна была быть вызвана другой причиной.
Ничего особенного не случилось бы. Вы должны написать в каком-то месте в середине выделенной памяти (100 байт от начала, 99 байт до конца выделенной памяти).
Тогда вы освободите эту выделенную память. Компилятор будет обрабатывать его именно так, как мы и ожидали. Память, выделенная этим, полностью не связана с завершенными нулем строками. Вы можете вставить все, что вы хотите в эту память. Это какой-то «сырой» кусок памяти, вы даже можете создать какой-нибудь произвольный объект C ++ в эту память (размещение нового).
Ваша ошибка где-то еще. Например, здесь есть одна распространенная ошибка, когда конструктор вызывается один раз, а деструктор вызывается дважды, что-то дважды удаляет:
struct A { P *p; A() { p = new P; } ~A() { delete p; } };
A getA() { return A(); } int main() { A a = getA(); }
Теперь происходит то, что конструктор по умолчанию вызывается один раз, и созданный объект копируется ноль или более раз. Но деструктор запускается для каждой созданной копии. Таким образом, вы будете вызывать деструктор по указателю более одного раза, что приводит к таким странным ошибкам. Правильный способ исправить , что - это использовать умный указатель, например shared_ptr
. В качестве упражнения вы также можете обойтись без этого, написав соответствующие конструкторы копирования, которые копируют объект и выделяют память в конструкторе копирования, так что копия и соответствующий исходный объект сохраняют разные указатели.
Я думаю, что вы путаете простой старый массив char с массивом char, представляющим строку в стиле C. Оператор удаления C ++ не заботится о строковом массиве в стиле C. Все, что он когда-либо увидит, это набор символов. Это действительно ничем не отличается от, скажем, удаления массива int.
Наличие или отсутствие нулевого терминатора имеет значение только в функциях, которые обрабатывают char*
как строку стиля C.
Это не должно иметь значения. delete [] следует использовать для удаления динамически размещенного массива независимо от его содержимого.
Это должно работать просто отлично, насколько я могу судить. Вы выделяете кусок памяти, и ОС должна следить за этим и иметь возможность освобождать его по запросу. Неважно, какие значения вы помещаете в буфер, который вы распределили.
Вставка значения NULL в середину массива символов, безусловно, помешала бы строковым функциям C, таким как strcmp
, strlen
и т. Д., Но это совсем другой вопрос.
Как уже отмечали другие, код, который вы разместили, совершенно действителен и не должен вызывать каких-либо проблем.
Ошибка могла быть вызвана изменением значения p
где-то посередине.