我想知道是否可以使用以下内存分配方法?

时间:2017-11-15 13:40:18

标签: c++ oop dynamic-memory-allocation

我想知道我可以使用以下方法吗?没有语法错误和任何警告,但我想知道是否有任何内存问题?

#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;
}

2 个答案:

答案 0 :(得分:4)

您的代码中有2个问题:

在此代码中:

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)。这意味着既然你定义了析构函数,你应该定义复制/移动构造函数/操作。

使用您的实现,复制/移动构造函数/操作是错误的。复制对象时,它会对指针进行浅层复制,并将其删除,因此您将进行双重删除。当你移动它时,你将删除一个你没有分配的指针。

加分点:你的内联无用