C++ cpp向量中的内存何时解除分配?

C++ cpp向量中的内存何时解除分配?,c++,memory,memory-management,vector,destructor,C++,Memory,Memory Management,Vector,Destructor,假设我在a.cpp中有一个函数fooRead(void**data),它声明了一个“vector x”,并从一个文件中读取100个foo对象。假设我从“b.cpp”调用fooRead,并使用fooRead(&data)传递对“void*data;””的引用 在foo.cpp中,我执行*data=x.data()。此后,当函数fooRead结束时,向量超出范围,将被自动销毁。那么这是否意味着b.cpp中的数据指向我现在不应该使用的内存 我对向量何时以及如何销毁(称为自动析构函数)感到非常困惑。非常

假设我在a.cpp中有一个函数
fooRead(void**data)
,它声明了一个“
vector x
”,并从一个文件中读取100个foo对象。假设我从“b.cpp”调用fooRead,并使用
fooRead(&data)传递对“
void*data;”
”的引用

在foo.cpp中,我执行
*data=x.data()
。此后,当函数fooRead结束时,向量超出范围,将被自动销毁。那么这是否意味着b.cpp中的数据指向我现在不应该使用的内存


我对向量何时以及如何销毁(称为自动析构函数)感到非常困惑。非常感谢您的帮助。我有点被卡住了

是的,b.cpp中的数据指向释放的内存(并且永远不要使用释放的内存)。根据,std::vector析构函数

破坏容器。元素的析构函数称为 并且已使用的存储被释放


因此,当向量在fooRead结束时超出范围时,它的存储(数据的输出)(
)也会被释放。

你能粘贴一些代码吗?我相信这个案例会更容易理解…请不要描述代码的作用。显示相关代码(不要将此解释为转储整个100行代码)
void**data
为什么?C++有一个很好的类型系统。学会使用它会使你成为更好的C++程序员。当对象超出范围时,调用
std::vector
的析构函数。就像所有其他析构函数一样。@PiotrNycz:我正在调用一个cpp函数(extern C),它来自我们之前编写的遗传算法C库。在这个问题上,有很多晦涩难懂的代码,如果不让它太长,就很难解释。@Tim:因为我希望b.cpp中的数据指向FOO的实例。如果我只传递了var数据,那么我就不会对b.cpp中的实际位置数据做任何处理。如果我在文件b.cpp中将向量声明为全局变量,请考虑这一点?它会在所有程序的作用域内吗?@PrakharAgrawal如果你想确定内存何时在全局作用域中分配和取消分配,为什么不制作一个这样做的程序,这样你就可以看到你自己了?@Toppest.of.Kek嗨,我真的试过了。但是在释放向量之前,内存仍然拥有它所拥有的东西(因为feeing内存只是告诉操作系统停止索引它,但不会将其置零)。我不知道我是否应该使用这个内存。在一个较大的程序中,我发现了一个关于内存损坏的bug,我很难找到它。所以我认为这可能是问题所在。@PrakharAgrawal您可以在b.cpp中将向量设为全局变量,也可以将其设为静态变量。这两种方法都存在一个问题,即下次运行fooRead时,将覆盖原始数据,这使得它不是非常线程安全或易于使用。fooRead是否可以简单地返回一个向量?@SCFrench否它无法返回向量,因为正在从C库调用cpp函数。我知道使其全局化将在下次调用该函数时覆盖数据,但使其不太线程安全是什么意思?