我想知道我可以使用以下方法吗?没有语法错误和任何警告,但我想知道是否有任何内存问题?
#include <iostream>
using namespace std;
class test {
int* x;
public:
test(int *n) { this->x = new int(*n); }
inline int get() { return *x; }
~test() { delete x; }
};
int main(void) {
while(1){
test a(new int(3));
cout << a.get() << endl;
}
return 0;
}
答案 0 :(得分:4)
您的代码中有2个问题:
您的课程违反了rule of three/five/zero
创建a
在此代码中:
test a(new int(3));
您使用值3动态分配int
并传递给使用值的a
ctor,并创建自己动态分配的int
。之后,这个记忆被泄露了。如果要将动态分配的数据传递给类,请使用智能指针:
class test {
std::unique_ptr<int> x;
public:
test(std::unique_ptr<int> n) : x( std::move( n ) ) { }
int get() const { return *x; }
};
int main()
{
x a( std::make_unique<int>( 3 ) ); // since c++14
x a( std::unique_ptr<int>( new int(3) ) ); // before c++14
...
}
并且您不需要明确地实现dtor,您不违反规则,将动态分配的数据传递给ctor是安全的。
注意:我假设您使用int
作为示例,您会理解动态分配一个int
是没用的,您应该按值存储它。
答案 1 :(得分:3)
你违反了规则3(自c ++ 11以来的5)。这意味着既然你定义了析构函数,你应该定义复制/移动构造函数/操作。
使用您的实现,复制/移动构造函数/操作是错误的。复制对象时,它会对指针进行浅层复制,并将其删除,因此您将进行双重删除。当你移动它时,你将删除一个你没有分配的指针。
加分点:你的内联无用