为什么我的 class 字段在构造函数中被破坏
Why my class field is destroyed in constructor
在我的构造函数中,我初始化了一个字段。该字段在初始化后立即被销毁。
这是我的代码和测试:
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
此代码:
t = T(100);
相当于:
T _temp(100);
t = _temp;
这有助于想象为什么有些 T
会被摧毁。这不是你的t
,而是临时的T(100)
。这就是为什么您会看到两张 "Destroying"... 一张用于临时打印,另一张用于 A::t
.
为避免虚假破坏,请使用初始化列表:
A::A()
: t(100)
{ }
在我的构造函数中,我初始化了一个字段。该字段在初始化后立即被销毁。 这是我的代码和测试:
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
此代码:
t = T(100);
相当于:
T _temp(100);
t = _temp;
这有助于想象为什么有些 T
会被摧毁。这不是你的t
,而是临时的T(100)
。这就是为什么您会看到两张 "Destroying"... 一张用于临时打印,另一张用于 A::t
.
为避免虚假破坏,请使用初始化列表:
A::A()
: t(100)
{ }