C++ 在被删除的对象内部动态分配对象会发生什么情况?

C++ 在被删除的对象内部动态分配对象会发生什么情况?,c++,pointers,memory-management,destructor,C++,Pointers,Memory Management,Destructor,当我在一个对象上使用delete关键字时,是否执行了objects析构函数?如果我删除的objected包含其他指针,而我没有删除它们,那会是内存泄漏吗 我有时对何时使用delete有点困惑。当我把东西传给别人时,这个问题对我来说是最糟糕的。我不知道什么时候使用delete是安全的,因为我害怕删除从其他地方指向的对象。这是内存泄漏。这是一个非常普遍的问题。当您删除使用new为其分配内存的对象时,它将调用该对象析构函数。析构函数是您应该提供清理和删除该对象生命周期内分配的所有内存的实现的地方。这是

当我在一个对象上使用delete关键字时,是否执行了objects析构函数?如果我删除的objected包含其他指针,而我没有删除它们,那会是内存泄漏吗


我有时对何时使用delete有点困惑。当我把东西传给别人时,这个问题对我来说是最糟糕的。我不知道什么时候使用delete是安全的,因为我害怕删除从其他地方指向的对象。

这是内存泄漏。这是一个非常普遍的问题。当您删除使用new为其分配内存的对象时,它将调用该对象析构函数。析构函数是您应该提供清理和删除该对象生命周期内分配的所有内存的实现的地方。

这是内存泄漏。这是一个非常普遍的问题。当您删除使用new为其分配内存的对象时,它将调用该对象析构函数。析构函数是您应该提供的实现,用于清除或删除在该对象的生存期内分配的所有内存。

如果使用new,则必须使用delete。这将触发调用实例的析构函数。如果该实例在其构造函数或更高版本中新建了任何对象,则应在其析构函数中删除它们

此外,如果您新建了数组new char[20]等,则在删除时必须使用“delete[]”,否则行为未定义

通过使用std::tr1::shared_ptr或boost::shared_ptr,您可以避免很多麻烦,它们将为您进行引用计数和删除,而不是:

Foo *pFoo = new Foo;


然后您不需要执行删除操作:当共享ptr的公共引用计数变为零时,它将为您执行删除操作。

如果使用“新建”,则必须使用“删除”。这将触发调用实例的析构函数。如果该实例在其构造函数或更高版本中新建了任何对象,则应在其析构函数中删除它们

此外,如果您新建了数组new char[20]等,则在删除时必须使用“delete[]”,否则行为未定义

通过使用std::tr1::shared_ptr或boost::shared_ptr,您可以避免很多麻烦,它们将为您进行引用计数和删除,而不是:

Foo *pFoo = new Foo;

然后,您不需要执行删除操作:当共享\u ptr的公共引用计数变为零时,它将为您执行删除操作

当我在一个对象上使用delete关键字时,是否执行了objects析构函数

对。这就是析构函数的作用

如果我删除的objected包含其他指针,而我没有删除它们,那会是内存泄漏吗

对。这是最常见的内存泄漏源之一

我不知道什么时候使用delete是安全的,因为我害怕删除从其他地方指向的对象

这是一个难题。没有一个系统能够完美地解决这个问题,但是通过使用引用计数的智能指针和减少共享对象的数量,您可以走得很远

当我在一个对象上使用delete关键字时,是否执行了objects析构函数

对。这就是析构函数的作用

如果我删除的objected包含其他指针,而我没有删除它们,那会是内存泄漏吗

对。这是最常见的内存泄漏源之一

我不知道什么时候使用delete是安全的,因为我害怕删除从其他地方指向的对象

这是一个难题。没有一个系统能够完美地解决这个问题,但是通过使用引用计数的智能指针和减少共享对象的数量,您可以走得很远

当我在应用程序上使用delete关键字时 对象是对象析构函数 执行

如果我删除了反对意见呢 包含其他指针,而我没有 删除它们,这是内存泄漏吗

是,除非其他人也有指针,并且其他人负责删除指针。由于双重删除,也可能出现问题。如果你删除了一个给你的指针,但是其他人有一个指向那个内存的指针,那么他的指针现在什么也不指向。当他使用该指针时,他的程序可能会崩溃

我不知道什么时候可以安全使用 删除,以免删除 从中指向的对象 在别的地方

你不是唯一一个。在代码的各个部分之间建立关于谁拥有什么的协议和约定是很重要的。什么是生产对象。是什么在消耗它们。您可能还希望使用诸如boost::shared_ptr和boost::weak_ptr之类的工具来允许引用计数

当我在应用程序上使用delete关键字时 对象是对象析构函数 执行

如果我删除了反对意见呢 包含其他指针,而我没有 删除它们,这是内存泄漏吗

是的,除非有人 e else还有一个指针,其他人负责删除它们。由于双重删除,也可能出现问题。如果你删除了一个给你的指针,但是其他人有一个指向那个内存的指针,那么他的指针现在什么也不指向。当他使用该指针时,他的程序可能会崩溃

我不知道什么时候可以安全使用 删除,以免删除 从中指向的对象 在别的地方


你不是唯一一个。在代码的各个部分之间建立关于谁拥有什么的协议和约定是很重要的。什么是生产对象。是什么在消耗它们。您可能还希望使用诸如boost::shared_ptr和boost::weak_ptr之类的工具来允许引用计数。

是的,这是一个漏洞。看看FAQ是否能为您的理解添加一些见解。

是的,这是一个漏洞。查看常见问题解答是否可以为您的理解添加一些见解。

当您调用delete someObect时;发生了这样的事情:

if(someObect != NULL)
{
someObect->~ClassName();// you did ClassName someObect = new ClassName(); 
operator delete(someObect);
}
运算符delete执行的操作与free执行的操作相同,只是释放内存。但请记住,如果您使用的是new,则不能使用free,您必须使用delete并仅使用它。

当您调用delete someObect时;发生了这样的事情:

if(someObect != NULL)
{
someObect->~ClassName();// you did ClassName someObect = new ClassName(); 
operator delete(someObect);
}
运算符delete执行的操作与free执行的操作相同,只是释放内存。但请记住,如果您使用了new,则不能使用free,您必须使用delete并仅使用它。

这不是delete关键字的问题,而是每个对象的销毁问题。如果您离开在堆上分配的对象的作用域,则将调用析构函数,并且您对指针的引用将丢失,这与使用new创建指针并使用delete销毁指针的方式相同。这不是delete关键字的问题,而是每个对象销毁的问题。如果将对象分配给堆的作用域保留,则将调用析构函数,并丢失对指针的引用,这与使用new创建它并使用delete销毁它的方式相同。