为何在类中添加vector<int>后,使用new[]创建对象数组会内存泄漏?
问题
测试代码如下:
#include <iostream> #include <memory> #include <vector> using namespace std; class G { public: vector<int> v = {1}; }; int main() { G* t = new G[5]; new (t) G(); delete [] t; }
编译命令:
clang++ -std=c++20 -fsanitize=address b.cpp -o main -Werror && ./main
AddressSanitizer检测到4字节内存泄漏,移除vector<int> v = {1}后代码运行正常。预期vector会被默认析构函数销毁,现需明确泄漏原因。
原因解析
- 数组初始化的资源分配:
new G[5]会构造5个G对象的数组,每个对象的vector都会完成初始化,为存储元素1分配4字节的动态内存。 - Placement new的行为:
new (t) G()是placement new,它直接在t指向的内存(数组第一个G对象的地址)上构造新的G对象,但不会自动调用原对象的析构函数。这导致原第一个G对象中的vector所持有的4字节内存未被释放,就被新对象覆盖。 - 析构阶段的遗漏:执行
delete [] t时,会对数组中每个G对象调用析构函数,但第一个位置析构的是后来通过placement new构造的新对象,原对象的vector资源已经丢失,无法被回收,最终造成内存泄漏。 - 无vector时的特殊情况:当
G中移除vector后,G成为平凡类型(trivial type),对象没有需要动态释放的资源,placement new覆盖时不会遗留未释放的内存,因此不会触发泄漏检测。
内容的提问来源于stack exchange,提问作者Altay Bus
相关产品推荐
相关产品推荐

