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 将被标准析构函数破坏。
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)