Удаление массива символов

Я понял это после прочтения документа 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));

Мне было трудно найти простую демоверсию в Интернете. Надеюсь, это поможет будущим людям.

23
задан Michael Myers 29 July 2017 в 19:26
поделиться

6 ответов

Код:

char *p = new char[200];
p[100] = '\0';
delete[] p;

идеально подходит для C ++. delete не знает или не заботится о строках с нулевым символом в конце, поэтому ваша ошибка должна была быть вызвана другой причиной.

40
ответ дан 29 November 2019 в 01:16
поделиться

Ничего особенного не случилось бы. Вы должны написать в каком-то месте в середине выделенной памяти (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 . В качестве упражнения вы также можете обойтись без этого, написав соответствующие конструкторы копирования, которые копируют объект и выделяют память в конструкторе копирования, так что копия и соответствующий исходный объект сохраняют разные указатели.

Вы также можете сделать это без написания соответствующих конструкторов копирования, которые копируют объект и выделяют память в конструкторе копирования, так что копия и соответствующий исходный объект сохраняют разные указатели.

Вы также можете сделать это без написания соответствующих конструкторов копирования, которые копируют объект и выделяют память в конструкторе копирования, так что копия и соответствующий исходный объект сохраняют разные указатели.

8
ответ дан 29 November 2019 в 01:16
поделиться

Я думаю, что вы путаете простой старый массив char с массивом char, представляющим строку в стиле C. Оператор удаления C ++ не заботится о строковом массиве в стиле C. Все, что он когда-либо увидит, это набор символов. Это действительно ничем не отличается от, скажем, удаления массива int.

Наличие или отсутствие нулевого терминатора имеет значение только в функциях, которые обрабатывают char* как строку стиля C.

6
ответ дан 29 November 2019 в 01:16
поделиться

Это не должно иметь значения. delete [] следует использовать для удаления динамически размещенного массива независимо от его содержимого.

3
ответ дан 29 November 2019 в 01:16
поделиться

Это должно работать просто отлично, насколько я могу судить. Вы выделяете кусок памяти, и ОС должна следить за этим и иметь возможность освобождать его по запросу. Неважно, какие значения вы помещаете в буфер, который вы распределили.

Вставка значения NULL в середину массива символов, безусловно, помешала бы строковым функциям C, таким как strcmp, strlen и т. Д., Но это совсем другой вопрос.

1
ответ дан 29 November 2019 в 01:16
поделиться

Как уже отмечали другие, код, который вы разместили, совершенно действителен и не должен вызывать каких-либо проблем.

Ошибка могла быть вызвана изменением значения p где-то посередине.

0
ответ дан 29 November 2019 в 01:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: