析构函数和删除 我有C++类, MyClass < />代码。它包含一个构造函数、析构函数和一个int指针private:int*MyPtr

析构函数和删除 我有C++类, MyClass < />代码。它包含一个构造函数、析构函数和一个int指针private:int*MyPtr,c++,destructor,C++,Destructor,在某个地方,我动态分配了一个MyClass对象: MyClass *my = new MyClass(); //... 然后我调用删除我的 MyClass是否应该使用类似于delete MyPtr的析构函数?或者,当我调用“删除我的”时,MyPtr是否已销毁?或者当我调用“删除我的”时,MyPtr是否已销毁 否,当您调用删除我的这将调用MyClass的析构函数,除非在析构函数中显式删除MyPtr,否则将出现内存泄漏 MyClass是否应该有一个使用类似delete MyPtr的析构函数? 始终

在某个地方,我动态分配了一个
MyClass
对象:

MyClass *my = new MyClass(); //...
然后我调用
删除我的


MyClass
是否应该使用类似于
delete MyPtr
的析构函数?或者,当我调用“删除我的”
时,MyPtr是否已销毁?

或者当我调用“删除我的”
时,MyPtr是否已销毁

否,当您调用
删除我的
这将调用
MyClass
的析构函数,除非在析构函数中显式删除MyPtr,否则将出现内存泄漏

MyClass是否应该有一个使用类似delete MyPtr的析构函数?


始终删除析构函数中动态分配的内存-这就是析构函数的用途。

或者当我调用delete my时,MyPtr是否已销毁?

否,当您调用
删除我的
这将调用
MyClass
的析构函数,除非在析构函数中显式删除MyPtr,否则将出现内存泄漏

MyClass是否应该有一个使用类似delete MyPtr的析构函数?


始终删除析构函数中动态分配的内存-这就是析构函数的用途。

如果您在MyClass构造函数中分配了MyPtr,则您有责任删除它。否则,如果删除未分配的内存,将导致未定义的行为

一种惯用的方法是在类内使用智能指针。如果您需要动态分配内存并将其删除,智能指针将为您处理内存释放


probaby值得一读:

如果您在MyClass构造函数中分配了MyPtr,那么您有责任删除它。否则,如果删除未分配的内存,将导致未定义的行为

一种惯用的方法是在类内使用智能指针。如果您需要动态分配内存并将其删除,智能指针将为您处理内存释放

也许值得一读:

当你打电话时

delete my
您不会释放该类的数据(除非在析构函数中指定),因此这将导致内存泄漏。

当您调用

delete my

您不会释放该类的数据(除非在析构函数中指定),因此这将导致内存泄漏。

delete
what you
new
。无论如何,如果需要DMA,只需使用智能指针即可。构造函数中是否使用
new
分配了
MyPtr
?如果是这样,那么您需要手动调用
delete
(并遵守三个规则)。否则为否,因为对象不拥有由
MyPtr
持有的指针。对delete的调用只能由指针的所有者完成。您尚未明确类的所有权语义,因此答案有争议。
delete
what You
new
。无论如何,如果需要DMA,只需使用智能指针即可。构造函数中是否使用
new
分配了
MyPtr
?如果是这样,那么您需要手动调用
delete
(并遵守三个规则)。否则为否,因为对象不拥有由
MyPtr
持有的指针。对delete的调用只能由指针的所有者完成。您还没有弄清楚类的所有权语义,因此答案是有争议的。因此,“delete my”指令将释放对象实例占用的相关内存,但不会释放其字段,如MyPtr?不是吗?只有指针MyPtr是类中的字段,而不是它所指向的内存。因此,当您销毁该类时,用于指针的内存将被释放,但指针指向的内存不会被释放。释放内存是你的责任。假设对象拥有指针。“这一点并没有被这个问题弄清楚。”洛基亚斯塔里说得对。我想了一会儿,是否应该把这个添加到我的答案中,但我认为这会比帮助更让人困惑。@PeterWood我想我的第一句话清楚地说明了这一点。您认为我应该显式地添加它吗?因此,“delete my”指令将释放对象实例占用的相关内存,但不会释放其字段(如MyPtr)?不是吗?只有指针MyPtr是类中的字段,而不是它所指向的内存。因此,当您销毁该类时,用于指针的内存将被释放,但指针指向的内存不会被释放。释放内存是你的责任。假设对象拥有指针。“这一点并没有被这个问题弄清楚。”洛基亚斯塔里说得对。我想了一会儿,是否应该把这个添加到我的答案中,但我认为这会比帮助更让人困惑。@PeterWood我想我的第一句话清楚地说明了这一点。你认为我应该明确地添加它吗?