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