gpt4 book ai didi

c++ - 使用 delete 关键字删除具有动态分配 block 的对象是否安全

转载 作者:太空狗 更新时间:2023-10-29 20:28:08 25 4
gpt4 key购买 nike

这个问题对某些人来说可能听起来太简单了,但我想了解如果我使用 delete 关键字

删除具有动态分配 block 的对象会发生什么情况

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

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

提前致谢

最佳答案

如果你有这样的事情:

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 对象中的动态 block 永远不会被释放。您可以使用释放它的析构函数来解决这个问题。 (当然,您还需要在类声明中声明析构函数):

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

我建议你做两件事

  1. 计算删除的和新的。如果它们不相同,那通常就是个问题。
  2. 阅读此 informative document关于 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);

请注意最后一个例子源码中的注释。通过使用实践 self 管理成员的类,巨大的重量从您的内存管理肩上卸下。在减轻这个重量的过程中,引入与之相关的错误的可能性也会增加,例如内存泄漏、浅拷贝风险等。

关于c++ - 使用 delete 关键字删除具有动态分配 block 的对象是否安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14087305/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com