如何删除在 c++ 中作为构造函数参数传递的已分配变量
How to delete allocated variable passed as a constructor parameter in c++
我是 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_x
和 m_y
,使用像 m_obj
这样的变量来存储指向新分配的 Obj1 对象的指针。然后,为 Obj2 提供一个析构函数,该析构函数使用 delete
来释放 m_obj
指向的内存。最后,适当地更改 getX(( 和 getY(( 方法以进行访问。
但是,将来我不建议在这种情况下使用动态分配的内存,因为它可能会变得不必要地复杂。相反,我建议使用引用,除非绝对必要,否则不必担心使用指针。
相关文章:
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- 参数包构造函数在类模板中隐藏用户定义的转换
- 我应该在C++中将这些结构用作参数化构造函数吗?
- 为什么即使我调用参数化构造函数也会调用默认构造函数?
- 使用向量初始化参数化构造函数的对象数组
- initializer_list具有默认参数的构造函数
- C++参数化构造函数使代码在传递大输入时停止工作
- 示例自定义共享_ptr-我如何传递构造函数参数 - 我在此处使用variadic模板
- 如何将lambda函数传递到具有未知类型和未知参数的构造函数
- 将 char 数组传递给参数化构造函数
- 用于以任意顺序传递参数的构造函数排列
- 在参数化构造函数中将数组作为参数传递
- 如何传递构造函数(可变参数)作为模板参数
- 通过值或引用传递构造函数参数
- 将带有模板类参数的构造函数传递给另一个函数
- 如何将对象的动态数组传递给另一个类的参数化构造函数
- 传递构造函数的首选参数
- 不能从switch case语句传递构造函数的参数
- 不能正确识别作为构造函数参数传递的函数