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

How to delete allocated variable passed as a constructor parameter in c++

本文关键字:参数传递 构造函数 变量 分配 何删除 删除 c++      更新时间:2023-10-16

我是 c++ 的新手,我正在学习使用"new"和"delete"进行内存分配

我得到了这个代码:

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

它工作得很好,但是如何删除分配的"Obj1"?

您可以建议以下代码:

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

然后

delete b;

但是如何使用:

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

谢谢

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

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

在您的 Obj2 类中,我建议不要使用 m_xm_y ,使用像 m_obj 这样的变量来存储指向新分配的 Obj1 对象的指针。然后,为 Obj2 提供一个析构函数,该析构函数使用 delete 来释放 m_obj 指向的内存。最后,适当地更改 getX(( 和 getY(( 方法以进行访问。

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