You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何在类中添加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会被默认析构函数销毁,现需明确泄漏原因。

原因解析
  1. 数组初始化的资源分配:new G[5]会构造5个G对象的数组,每个对象的vector都会完成初始化,为存储元素1分配4字节的动态内存。
  2. Placement new的行为:new (t) G()是placement new,它直接在t指向的内存(数组第一个G对象的地址)上构造新的G对象,但不会自动调用原对象的析构函数。这导致原第一个G对象中的vector所持有的4字节内存未被释放,就被新对象覆盖。
  3. 析构阶段的遗漏:执行delete [] t时,会对数组中每个G对象调用析构函数,但第一个位置析构的是后来通过placement new构造的新对象,原对象的vector资源已经丢失,无法被回收,最终造成内存泄漏。
  4. 无vector时的特殊情况:当G中移除vector后,G成为平凡类型(trivial type),对象没有需要动态释放的资源,placement new覆盖时不会遗留未释放的内存,因此不会触发泄漏检测。

内容的提问来源于stack exchange,提问作者Altay Bus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 17:52:17