gpt4 book ai didi

c++ - 在析构函数中处理 STL 容器的取消分配

转载 作者:行者123 更新时间:2023-11-30 01:22:14 27 4
gpt4 key购买 nike

这是我第一次使用 STL,我很困惑我应该如何释放这些容器使用的内存。例如:

class X {
private:
map<int, int> a;
public:
X();
//some functions
}

现在假设我将构造函数定义为:

X::X() {
for(int i=0; i<10; ++i) {
map[i]=i;
}
}

现在我的问题是我应该为这个类编写析构函数还是默认的 C++ 析构函数将负责(完全)释放内存?

现在考虑修改上面的类

class X {
private:
map<int, int*> a;
public:
X();
~X();
//some functions
}

现在假设我将构造函数定义为:

X::X() {
for(int i=0; i<10; ++i) {
int *k= new int;
map[i]=k;
}
}

现在我明白了,对于这样一个类,我需要编写一个析构函数,因为 new 分配的内存不能被 map 容器的默认析构函数析构(因为它调用对象的析构函数,其中这种情况是一个指针)。所以我尝试编写以下析构函数:

X::~X {
for(int i=0; i<10; ++i) {
delete(map[i]);
}
//to delete the memory occupied by the map.
}

我不知道如何删除map占用的内存。虽然 clear 函数在那里,但它声称将容器的大小降低到 0,但不一定释放下面的内存。 vector 也是如此(我猜是 STL 中的其他容器,但我没有检查过它们)。

感谢任何帮助。

最佳答案

should I write the destructor for this class or the default C++ destructor will take care of deallocating the memory(completely)?

是的,会的。所有标准容器都遵循RAII的原则,并管理自己的动态资源。当它们被销毁时,它们将自动释放它们分配的任何内存。

I do not know how to delete the memory occupied by the map.

你不知道。当且仅当您使用 new 创建某些内容时,您才必须删除它。大多数对象都会自动分配和释放内存。

映射本身嵌入到要销毁的 X 对象中,因此它会自动销毁,一旦析构函数完成,它的内存将与对象的内存一起释放。

map 分配的任何内存都是 map 的责任;它将在自动调用的析构函数中释放它。

您只负责删除动态分配的 int 对象。由于很难确保正确删除它们,因此您应该始终使用 RAII 类型(例如智能指针或映射本身)来为您管理内存。 (例如,如果 new 的使用抛出异常,您的构造函数就会发生内存泄漏;通过存储对象或智能指针而不是原始指针可以很容易地解决这个问题。)

关于c++ - 在析构函数中处理 STL 容器的取消分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16798274/

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