我'我是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));
由于
答案 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_y
和m_obj
。然后,为Obj2提供一个析构函数,它使用delete
来释放m_obj
指向的内存。最后,适当地改变你的getX()和getY()方法来访问。
但是,在将来,我不建议在这种情况下使用动态分配的内存,因为它可能会变得不必要地复杂化。相反,我建议使用引用,除非绝对必要,否则不要担心使用指针。