如果我将 vector<int> 添加到用于通过 new[] 创建数组的类中,为什么会出现内存泄漏

Alt*_*Bus 0 c++ memory-leaks vector address-sanitizer

我写了这段代码:

#include <iostream>
#include <memory>
using namespace std;

class G {
public:
    vector<int> v = {1};
};

int main() {
    G* t = new G[5];
    new (t) G();
    delete [] t;
}
Run Code Online (Sandbox Code Playgroud)

我通过这种方式编译:

clang++ -std=c++20 -fsanitize=address b.cpp -o main -Werror && ./main
Run Code Online (Sandbox Code Playgroud)

sanitizer 检测到内存泄漏,4 字节,因为我将向量 v = {1} 添加到 G 类。没有这个向量它可以正常工作。请告诉我问题是什么,我不明白。

我预计该代码会正常工作。我预计向量 v 将被标准析构函数破坏。

S.M*_*.M. 5

G* t = new G[5];G用向量构建5 t[0]...t[4]

new (t) G();再次构造一个新的G对象及其向量t[0],而不破坏G该存储中先前构造的对象及其向量。您需要在覆盖旧对象之前销毁它们:

#include <iostream>
#include <memory>
using namespace std;

class G {
public:
    vector<int> v = {1};
};

int main() {
    G* t = new G[5];
    t[0].~G(); // <-- add this
    new (t) G();
    delete [] t;
}
Run Code Online (Sandbox Code Playgroud)