Прежде всего, я не использовал C++ много времени, и вполне возможно, что этот вопрос очень прост, и его не стоит публиковать здесь. Во всяком случае, я не нашел никакого решения здесь или в другом источнике. Моя проблема заключается в следующем. Давайте предположим, что у нас есть класс A
:инициализация и деструктор массива char
Class A
{
char* string;
public:
char*& getString(){ return string; }
~A()
{
if (string)
delete[] string;
}
};
Я не могу изменить этот класс (это просто пример реального класса). Я хочу, чтобы установить поле string
к значению:
int main()
{
A a;
a.getString() = new char[3];
a.getString() = "Hi\0";
return 0;
}
Этот код причины Debug Assertion Сбой при деструктор ~A()
называется. Что я здесь делаю неправильно? Я действительно буду признателен за любое предложение о том, что я делаю неправильно.
EDIT: Кажется, этот оператор назначения здесь важен. На самом деле, я делаю такое задание:
int main()
{
A a;
char name[256];
std::cin.getline(name, 256);
a.getString() = new char[strlen(name)];
//actual version
strcpy_s(a.getString(), strlen(name), name);
//a.getString() = "Hi\0";
return 0;
}
Вы пытаетесь «удалить» статически выделенную строку (все строковые литералы статически распределены). Предположим std :: string и удалим ваш деструктор (std :: string использует RAII и автоматически обрабатывает его ресурсы). – Kevin
Назначение не ведет себя по-разному в зависимости от текущего значения. Он всегда назначает новое значение и перезаписывает старый. – chris
Ваш код сводится к 'delete []" Hi ";'. Вы пытаетесь «удалить» указатель, который не был назначен «новым». Вы также просачиваете предыдущее распределение. –