gpt4 book ai didi

C++ 基础、 vector 、析构函数

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

我对如何执行此操作的最佳实践有点困惑。假设我有一个类,例如分配一些内存。我希望它像汽车一样自毁,但出于某种未知原因也将其放入 vector 中。

 #include <iostream>
#include <vector>
class Test {
public:
Test();
Test(int a);
virtual ~Test();
int counter;
Test * otherTest;
};

volatile int count = 0;


Test::Test(int a) {
count++;
counter = count;
std::cout << counter << "Got constructed!\n";
otherTest = new Test();
otherTest->counter = 999;
}

Test::Test() {
count++;
counter = count;
std::cout << counter << "Alloced got constructed!\n";
otherTest = NULL;
}


Test::~Test() {
if(otherTest != 0){
std::cout << otherTest->counter << " 1Got destructed" << counter << "\n";
otherTest->counter = 888;
std::cout << otherTest->counter << " 2Got destructed" << counter << "\n";
}
}

int vectorTest(){
Test a(5);
std::vector<Test> vecTest;
vecTest.push_back(a);
return 1;
}

int main(){
std::cout << "HELLO WORLD\n";
vectorTest();
std::cout << "Prog finished\n";
}

在这种情况下,我的析构函数从计数器 1 被调用两次,alloc' 对象已经设置为 888(或者在实际情况下释放导致对已删除对象的错误访问)。将局部变量放入 vector 的正确情况是什么,这是某种永远不会发生的设计。下面的行为不同,析构函数只被调用一次(考虑到它的分配是有意义的)。

 int vectorTest(){
//Test a(5);
std::vector<Test> vecTest;
vecTest.push_back(*(new Test(5)));
return 1;
}

如何使局部变量的行为相同,从而只调用一次析构函数?本地人永远不会被放入 vector 中吗?但是 vector 不是优于数组吗,如果有大量本地对象我想单​​独初始化并放入 vector 中并将其传递给另一个函数而不使用空闲/堆内存怎么办?我想我在这里遗漏了一些重要的东西。这是某种转移所有权的智能指针的情况吗?

最佳答案

vector 维护自己的存储并将值复制到其中。由于您没有实现复制构造函数,因此使用默认构造函数,它只复制指针的值。因此这个指针被删除了两次,一次被局部变量析构函数删除,一次被 vector 删除。不要忘记 rule of three .您要么需要实现复制和赋值运算符,要么只使用已经执行此操作的类,例如 shared_ptr。

请注意,此行会导致内存泄漏,因为您使用 new 分配的对象永远不会被删除:

vecTest.push_back(*(new Test(5)));

关于C++ 基础、 vector 、析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4399330/

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