3

这个问题对某些人来说可能听起来太简单了,但我试图了解如果我使用delete 关键字删除具有动态分配块的对象会发生什么

调用 delete 会做两件事,首先调用析构函数,然后释放内存。如果 delete 正在释放对象内存,那么它是否也会释放动态分配的内存,或者我是否必须在析构函数中编写一段代码才能真正安全地释放内存块。

此外,如果对象在堆中分配内存,那么除了成员变量之外的其他东西将占用分配给对象的内存。

提前致谢

4

5 回答 5

4

如果你有这样的事情:

class Foo
{
public:
   int* block;

   Foo()
   {
       block = new int[10];
   }

private:
   Foo(const Foo&);
   Foo& operator =(const Foo&);
};

随后执行此操作:

Foo* foo = new Foo;
delete foo;

那么是的,你正在泄漏内存。Foo 对象中的动态块永远不会被释放。您可以使用释放它的析构函数来解决这个问题。(源代码,您还需要在类声明中声明析构函数):

Foo::~Foo()
{
    delete [] block;
}

我建议你做两件事

  1. 计算删除的和新的。如果它们不一样,那通常是一个问题。
  2. 阅读有关C++ 动态指针和内存使用的信息性文档。

在 #2 之后,顺便说一句,可能会给您一个类似于此的对象:

class Foo
{
public:
   std::array<int,10> block;

   Foo() // note: default-construction of `block`
   {
   }

   // note: default *destructor* will clean up member variables
   //  by firing their destructors for you. in this case the destructor
   //  for our 'block' member is a std::array that knows how to self-clean.

   // note: we no longer have to hide or implement copy construction and
   //  assignment operator functionality. The default implementation of 
   //  these properly member-copy and member-assign respectively.
};

和这样的用法(许多可能性之一):

std::unique_ptr<Foo> foo(new Foo);

请注意最后一个示例源代码中的注释。通过使用练习自我管理成员的类,你的内存管理肩上的重担会减轻很多。在提升这个重量的过程中,引入与之相关的错误的可能性也会增加,比如内存泄漏、浅拷贝风险等。

于 2012-12-30T01:01:06.157 回答
1

调用时释放的内存delete只是对象本身占用的内存。该对象占用多个连续字节,这些字节在delete. sizeof(MyType)会告诉你有多少字节。并且没有其他任何东西被释放delete。其他一切都由析构函数(或单个成员对象的析构函数)释放

于 2012-12-30T00:52:21.660 回答
1

使用动态分配的块,您需要调用 delete[]。

例如:

class C
{
    //some members
public:
    C() {...}
    ~C() {...} 
    // some methods
};

int main()
{
C * arr = new C[10]; // Dynamically allocated memory

// some code using arr . . .

delete[] arr; // Calling ~C() for each C element in arr and then releasing the dynamically alloacted memory on the heap pointed by arr.
}

但是,如果另外你有一个动态分配的成员指针,你需要在对象的析构函数中删除它:

C::C()
: memberArray(new int[10]) {  }

C::~C()
{
   delete[] memberArray;
   memberArray = NULL;
}
于 2012-12-30T01:02:40.530 回答
0

析构函数的一个用途是调用delete它包含的每个指针属性的语句。例如,如果我有一个类“car”,它有一个属性“tire”,它是一个指针,你需要在汽车的析构函数中删除这个属性。

于 2012-12-30T00:52:15.497 回答
0

不,分配的内存不会被释放。

当一个分配了动态内存并分配给指针的对象被删除时,只会释放指针,不会释放它指向的数据。当一个对象分配内存时,您必须在其析构函数中手动调用该数据的删除,或者确保它被其他获得该数据指针的对象删除。

自动删除它是不可能的,因为该对象可能已经将分配的数据传递给另一个在分配对象被删除后仍然需要它的对象。

于 2012-12-30T00:53:18.023 回答