C++ C++;:在派生类对象被破坏时释放动态内存
我似乎对动态内存分配有问题 下面您将看到一个派生类,它包含一个name变量指针,该变量将使用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
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。很难说没有看到。可能是与.Thatname
函数泄漏内存有关的问题。