У меня, похоже, проблема с распределением динамической памяти.C++: Развертывание динамической памяти, когда объект производного класса разрушен
Ниже вы увидите производный класс, содержащий указатель на переменную имени, которая будет динамически распределяться с использованием метода void name(const char* name)
. Функция запускается конструктором Product, который задает имя для класса продукта при создании объекта. Вот класс:
namespace sict {
class Product :public Streamable {
char* name_;
public:
Product(const char* name);
virtual ~Product();
void name(const char* name);
}
А вот само имя функции, наряду с конструктором один аргумент:
void sict::Product::name(const char * name) {
int g = strlen(name);
name_ = new char[g];
strncpy(name_, name, g);
name_[g] = 0;
}
Product::~Product() {
delete [] name_;
name_ = nullptr;
}
Для меня этот код кажется способным достаточно создаваемого объекта затем уничтожить его мирно, когда он выходит объем выполняемой функции. Однако, когда функция заканчивается и деструктор работает, программа зависает/падает на delete [] name_
. Запуск программы в компиляторе Visual Studio, похоже, не дает особых ошибок (кроме замораживания программы), но компилятор gcc обнаруживает какое-то кучное повреждение. Кто-нибудь знает, почему это происходит?
'name_ [г] = 0;' списывает конца выделенного массива, повреждать кучу. Попробуйте изменить 'g' на' strlen (name) + 1' для подтверждения. Поскольку это C++, вам будет намного лучше использовать ['std :: string'] (http://en.cppreference.com/w/cpp/string/basic_string) и позволить ему обрабатывать управление памятью для вас. –
Вы не придерживаетесь [Правило 3] (http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three). – PaulMcKenzie
О, это просто, просто используйте 'std :: string'. Знаете, это C++. Not C. –