如何删除在c ++中作为构造函数参数传递的已分配变量

时间:2014-08-01 16:37:51

标签: c++

我'我是c ++的新手,我正在学习使用" new"和"删除"

我收到了这段代码:

#include <iostream>

class Obj1
{
public:
    Obj1(int x, int y) : m_x(x), m_y(y)
    {}

    int getX(){return m_x;}
    int getY(){return m_y;}

private:
    int m_x;
    int m_y;
};

class Obj2
{
public:
    Obj2(Obj1* a): m_x(a->getX()), m_y(a->getY())
    {}

    int getX(){return m_x;}
    int getY(){return m_y;}

private:
    int m_x;
    int m_y;
};

int main()
{
    Obj2 a(new Obj1(1, 2));

    std::cout << a.getX() << std::endl;//displays 1
    std::cout << a.getY() << std::endl;//displays 2

    return 0;
 }

它工作正常,但如何删除已分配的&#34; Obj1&#34;?

您可以建议使用以下代码:

Obj1* b;
b = new Obj1(1, 2);
Obj2 a(b);

然后

delete b;

但如何做到:

 Obj2 a(new Obj1(1, 2));

由于

2 个答案:

答案 0 :(得分:1)

Obj2 a( std::make_shared<Obj1>( 1, 2 ).get() );

您必须拥有拥有动态分配的Obj1的内容并可能导致其被删除。 std::make_shared<T>()可用于生成shared_ptr,在这种情况下,它是一个临时值,仅在Obj2构造函数调用期间存在。

当然,还有更简单的

int main()
{
    Obj1 aa( 1, 2 );
    Obj2 a( &aa );

    std::cout << a.getX() << std::endl;//displays 1
    std::cout << a.getY() << std::endl;//displays 2

    return 0;
}

根本不使用动态分配。这两个对象都是自动的。

答案 1 :(得分:0)

在你的Obj2课程中,我建议使用像m_x之类的变量来存储指向新分配的Obj1对象的指针,而不是m_ym_obj。然后,为Obj2提供一个析构函数,它使用delete来释放m_obj指向的内存。最后,适当地改变你的getX()和getY()方法来访问。

但是,在将来,我不建议在这种情况下使用动态分配的内存,因为它可能会变得不必要地复杂化。相反,我建议使用引用,除非绝对必要,否则不要担心使用指针。