创建'new'实例可以解决析构函数崩溃问题?
Creating a 'new' instance solves destructor crash?
我创建了一个子类B,用于我称为a。
的类我为工作编写了此代码,所以我将概括实际的代码:
class A
{
public:
A ()
{
important_variable = new Type();
...
};
~A (void) { delete(important_variable); }; // Default destructor
// more methods
protected:
Type *important_variable;
};
class B : public A
{
public:
B() : A() { important_variable = another_var; }
~B() {};
Type *another_var;
};
为B提供此代码,导致我的程序崩溃了,而"未经治疗的异常"。
现在,当我将B类代码更改为此:
class B : public A
{
public:
B() : A() { another_var = new Type(); important_variable = another_var; }
~B() {};
Type *another_var;
};
例外消失了。
我认为我的原始代码导致我的程序崩溃,因为A试图删除一个仍被另一个变量指向的变量。这是正确的吗?为什么B的新代码导致我的程序工作?
您的代码中有许多缺陷,但是最有可能导致崩溃的一个缺陷是:
important_variable = another_var;
another_var
不能指向可以删除的任何地方。但是important_variable
是指向同一位置,然后在A
的构造器中删除。
您的"解决方案"以内存泄漏为代价掩盖了问题。当您这样做
another_var = new Type(); important_variable = another_var;
important_variable
指向的原始动态分配的Type
对象丢失了。
除此之外,您还需要遵循三个规则。
新的和删除仅用于处理堆分配。我怀疑在您的第一次列表中,another_var
可能分配在堆栈上,这就是导致灾难中例外的原因。此外,每当您有基础课时,您都应该制作其destructor virtual
。
原始版本崩溃了,因为您将important_variable
设置为非初始化的another_var
,然后尝试删除此非初始化值。在"校正"版本中,您至少不会删除非初始化的变量,但仍包含内存泄漏 - 您将新分配的内存分配给important_variable
,然后立即分配给此变量another_var
的值,因此最初分配的内存不再是可访问并将泄漏。
相关文章:
- 内联映射初始化的动态atexit析构函数崩溃
- 递归导致程序崩溃,但 while 循环中的相同概念不是来自C++析构函数
- 在C++中删除指针数组时析构函数崩溃
- C++ - 定义自定义析构函数时程序崩溃
- 引发导致调用析构函数的异常会使程序崩溃
- 使用指针的矢量矩阵在对象上调用析构函数时程序崩溃
- 程序在析构函数处崩溃
- 在析构函数之后打开新的QMainWindow崩溃
- 清理所拥有的(!)字符串成员时,析构函数偶尔崩溃
- 创建'new'实例可以解决析构函数崩溃问题?
- C++SDL_FreeSurface在析构函数中崩溃
- 执行析构函数时,服务器应用程序总是崩溃
- 为什么调用基类析构函数会使此程序崩溃
- 在未使用的类的默认析构函数处崩溃
- 基类析构函数不是虚拟的,子类析构函数是虚拟的,程序崩溃
- 空析构函数崩溃程序:C++
- boost::任何析构函数崩溃
- VS CTP 14的std::线程析构函数崩溃
- 使用std::enable_shared_from_this时,析构函数崩溃
- 定义_CRT_SECURE_NO_WARNINGS会导致vector析构函数崩溃