gpt4 book ai didi

c++ - STL vector 内存管理

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:05:14 24 4
gpt4 key购买 nike

我正在使用 borland 2006 c++,并且有以下代码。我正在使用 vector ,但无法理解为什么未调用析构函数。

基本上我有一个A类

class A
{
private:
TObjectList* list;
int myid;
public:
__fastcall A(int);
__fastcall ~A();
};

__fastcall A::A(int num)
{
myid = num;
list = new TObjectList();

}

__fastcall A::~A()
{
delete list;
}

int main(int argc, char* argv[])
{
myfunc();
return 0;
}

void myfunc()
{
vector<A*> vec;
vec.push_back(new A(1));
vec.push_back(new A(2));
}

根据我的阅读,当变量 vec 超出 myfunc() 的范围时,它应该析构它包含的元素,因此应该调用 A 的析构函数。我在 ~A() 处有一个断点,但从未被调用,我也尝试过调整大小()、删除方法

TIA

最佳答案

vec 在超出作用域时会销毁它的元素。这里的问题是 vec 的元素是指向 A 对象的指针,而不是 A 对象本身。如果你反而做了

vector<A> vec;
vec.push_back(A(1));
vec.push_back(A(2));

...那么事情就会如您所愿。

ETA:不过请注意,如果您这样做,则必须为 A 定义一个复制构造函数。这应该涉及对 TObjectList 成员进行深度复制。否则,当您复制一个 A 对象时,您将得到两个指向同一个 TObjectList 的对象,并且当第二个对象被销毁时您的程序将崩溃。

关于c++ - STL vector 内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1009137/

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