C++ C++;:在派生类对象被破坏时释放动态内存

C++ C++;:在派生类对象被破坏时释放动态内存,c++,debugging,error-handling,dynamic-memory-allocation,heap-corruption,C++,Debugging,Error Handling,Dynamic Memory Allocation,Heap Corruption,我似乎对动态内存分配有问题 下面您将看到一个派生类,它包含一个name变量指针,该变量将使用void name(const char*name)方法动态分配。该函数由产品构造函数运行,该构造函数在创建对象时为产品类设置名称。下面是课程: namespace sict { class Product :public Streamable { char* name_; public: Product(const char* name); virtual ~Produ

我似乎对动态内存分配有问题

下面您将看到一个派生类,它包含一个name变量指针,该变量将使用
void name(const char*name)
方法动态分配。该函数由产品构造函数运行,该构造函数在创建对象时为产品类设置名称。下面是课程:

namespace sict {
  class Product :public Streamable {

    char* name_;

public:

    Product(const char* name);
    virtual ~Product();

    void name(const char* name);

}
下面是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_uz
处冻结/崩溃。在VisualStudio的编译器上运行该程序似乎不会产生任何特定错误(程序冻结除外),但gcc编译器会检测到某种堆损坏。有人知道为什么会发生这种情况吗?

我不知道为什么肖恩·克莱恩没有发表他的评论作为答案,但肖恩是正确的

name\ug
被赋予
g
元素,然后
name\ug]
被设置为零,但是
name\ug]
是数组末尾的一个。使用
name_u2;=新字符[g+1]
名称\ug-1]=0这样就不会超过数组的末尾

另外,正如一些评论所指出的,每当您有一个动态分配内存的类时,请确保您定义了复制构造函数赋值操作符,以及析构函数。如果您错过了一个,默认实现将执行浅拷贝,这可能会给您带来麻烦

浅复制是指复制指针而不是指针指向的数据。在您的情况下,如果复制或分配了此类的对象,则最终会有两个对象指向堆上的相同数据,并且它们在运行析构函数时都会尝试删除该数据


有关这些函数的更多信息,请参见

name\ug]=0注销已分配数组的结尾,从而损坏堆。尝试将
g
更改为
strlen(name)+1
以确认。因为这是C++,你最好使用它,让它处理内存管理。你不遵守。哦,这个很容易,只使用<代码> STD::String < /C>。你知道,它是C++。不是C。很难说没有看到。可能是与.That
name
函数泄漏内存有关的问题。