删除作为公共类成员的指针
deletion of pointer that is a public class member
我有一个结构/类,它的成员是指针,比如
struct myStruc
{
int* m_p;
}
1。问题:我应该在哪里删除指针?在析构函数中?
myStruct::~myStruct()
{
delete m_p;
}
2。问题:如果指针被赋值给一个指针数组,例如
myStruct mS;
mS.m_p = new int[3];
是否有一个很好的方法(没有dynamic_cast或try-catch)现在,如果我必须做delete
或delete[]
?
你不应该允许"用户"乱动数据结构中的指针。将指针设为私有并使用get/set函数来访问它。
:
struct myStruc
{
private:
int* m_p;
public:
int* ptr() { return m_p; }
void allocate(int n) { m_p = new int[n];
myStruc() : m_p(0) {};
~myStruc() { delete [] m_p; }
};
编辑:上面的类是不完整的,它是显示概念。对于一个完整的类,您将需要一个复制构造函数和一个赋值操作符,并且可能从allocate
函数中"记住"n
。
现在您再也不用担心是否分配了[],因为它是一致的。
当然,您可以使用std::vector
来实现这一点,而无需任何额外的努力。
理想情况下,根本不应该使用原始指针成员。你有两个更好的选择:
- 使用
std::vector
或 - 使用智能指针作为成员,并根据您的用法语义选择正确的指针。
如果不能使用智能指针而必须使用原始指针,则:
- 如果你使用
new
分配指针,那么使用delete
,如果你使用new []
,那么你需要使用delete []
。不应该存在不匹配。 - 每次动态分配的成员生命周期结束时,需要调用
delete
或delete []
。假设该成员的生命周期与类的生命周期相同,它将位于析构函数中。 重要的是你应该遵循三规则。
- 理想的在析构函数中。但是要遵循"三原则"。
- 应该使用
delete[]
。new/new[]
应分别使用delete/delte[]
相关文章:
- 从成员指针到整个结构/类的强制转换
- OOP 中的单成员指针
- 使用结构成员指针在C++中填充结构
- 聚合初始化,将成员指针设置为同一结构成员
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 共享 C++ 的数据成员指针
- 如何声明指向成员内容的成员指针m_pmd/m_pmf并访问它们?
- 从类C++外部调用指向成员方法的成员指针
- 结构成员指针是否自动初始化为零?
- 如何删除类内类类型的类成员指针
- 是否打印指向已定义 int 的成员指针
- 指向常量的成员指针
- 通过此指针访问时的成员差异和自身的成员指针(简单的 QT 示例问题)
- 类数据成员指针的非类型模板参数包无法使用 gcc 编译
- 为什么我不能在同一行中定义两个相同类型的类的成员指针
- 将类成员指针传递给 Lambda 捕获列表 c++11
- 在单一实例类中将成员指针设置为 null 的正确方法是什么
- 无法删除在destructor中的成员指针的课程
- 删除对象而不调用成员指针的析构函数
- 当派生类的基类具有成员指针时,对其进行深层复制