在我的构造函数中,我初始化一个字段。初始化后,该字段将被销毁。 这是我的代码和测试:
A.hpp
class A {
private:
T t;
public:
A();
~A();
void add(string name, string num);
};
A.cpp
A::A() {
cout << "Creating A\n";
t = T(100);
cout << "End\n";
}
void A::add(string name, string num) {
cout << "calling add in A\n";
t.add(name, num);
}
T.hpp
class T {
private:
E * t;
public:
T(int size=100);
~T();
void add(std::string name, std::string num);
T.cpp
T::T(int size) : size(size) {
t = new E[size];
}
T::~T() {
cout << "Destroying\n";
// delete[] t; // if I don't comment this I get Segfault when calling add method
}
void T::add(string name, string num){
E e = E(name, num);
t[0] = e;
}
的main.cpp
int main(int argc, char* argv[]) {
A a;
a.add("name", "num");
}
输出
Creating A
Destroying
End
calling add in A
Destroying
答案 0 :(得分:4)
此代码:
t = T(100);
等同于:
T _temp(100);
t = _temp;
这有助于想象一些T
被摧毁的原因。它不是您的t
,而是临时T(100)
。这就是为什么你会看到两个&#34;销毁&#34; ...一个用于临时,一个用于A::t
。
为避免虚假破坏,请使用初始化列表:
A::A()
: t(100)
{ }