C++ 删除作为公共类成员的指针
我有一个结构/类,其成员是指针C++ 删除作为公共类成员的指针,c++,pointers,C++,Pointers,我有一个结构/类,其成员是指针 struct myStruc { int* m_p; } 1。问题:我应该在哪里删除指针?在析构函数中 myStruct::~myStruct() { delete m_p; } 2。问题:如果指针被分配到指针数组,例如 myStruct mS; mS.m_p = new int[3]; 如果我必须执行delete或delete[],现在有没有一个好方法(没有动态播放或尝试捕获) 理想情况下,在析构函数中。但要遵循规则 您应该使用delete
struct myStruc
{
int* m_p;
}
1。问题:我应该在哪里删除指针?在析构函数中
myStruct::~myStruct()
{
delete m_p;
}
2。问题:如果指针被分配到指针数组,例如
myStruct mS;
mS.m_p = new int[3];
如果我必须执行delete
或delete[]
,现在有没有一个好方法(没有动态播放或尝试捕获)
delete[]
new/new[]
应分别使用delete/delte[]
delete[]
new/new[]
应分别使用delete/delte[]
理想情况下,您根本不应该使用原始指针成员。您有两个更好的选择:
std::vector
或- 如果使用
分配指针,则使用new
,如果使用delete
则需要使用new[]
。不应该有不匹配李>delete[]
- 每次动态分配的成员生命周期结束时,您都需要调用
或delete
。假设此成员的生存期与类的生存期相同,它将位于析构函数中李>delete[]
- 重要的是你应该遵循
- 使用
或std::vector
- 使用智能指针作为成员和李>
如果不能使用智能指针,必须使用原始指针,则:
- 如果使用
分配指针,则使用new
,如果使用delete
则需要使用new[]
。不应该有不匹配李>delete[]
- 每次动态分配的成员生命周期结束时,您都需要调用
或delete
。假设此成员的生存期与类的生存期相同,它将位于析构函数中李>delete[]
- 重要的是你应该遵循
函数中“记住”allocate
现在你再也不用担心你是否分配了[],因为它是一致的 当然,您可以使用std::vector来实现这一点,而无需任何额外的努力。您不应该允许“用户”干扰数据结构中的指针。将指针设为私有,并使用get/set函数访问它 因此: 编辑:上面的类不完整,它显示的是概念。对于一个完整的类,您需要一个复制构造函数和赋值运算符,并且可能需要从n
函数中“记住”allocate
现在你再也不用担心你是否分配了[],因为它是一致的n
当然,您可以使用
来实现这一点,而无需任何额外的努力。A/方法是在构造函数中分配内存,并在析构函数中取消分配内存。您能详细介绍一下该用例吗?myStruc的目的是什么?谁在设置m\p?穆普指的是什么?谁决定并知道这一点?@DaveRager虽然这是一个很好的一般建议,std::vector
通常只是一个没有太多附加功能的数据集合,这些数据通常是struct
公共的,因为不需要太多的封装。至少当我看到一个类被定义为
时,我就明白了这一点。方法是在构造函数中分配内存,在析构函数中释放内存。你能告诉我更多关于这个用例的信息吗?myStruc的目的是什么?谁在设置m\p?穆普指的是什么?谁决定并知道这一点?@DaveRager虽然这是一个很好的一般建议,struct
通常只是一个没有太多附加功能的数据集合,这些数据通常是struct
公共的,因为不需要太多的封装。至少当我看到一个类被定义为
时,我就明白了这一点。关于2.:现在如何使用新的int[3]?如果struct
会失败。为什么理想情况下在析构函数中?结构如何知道它是否应该删除指针,或者是否调用mS.m_p=new int()怎么办代码>是否已执行<代码>删除[]
或delete
?@juanchopanza在我看来,原始指针通常在析构函数中返回它的资源。我在2中回答了你评论中的删除部分。析构函数无法知道是否使用了delete[]
或new[]
。@juanchopanza如果我的陈述不明确,我很抱歉。返回获取的资源是程序员的责任。我在2中所说的是,如果程序员已经使用new/new[]获得了资源,那么必须使用相应的delete/delete[]。关于2:new int[3]已经被使用了,我该怎么做?如果new
会失败。为什么理想情况下在析构函数中?结构如何知道它是否应该删除指针,或者是否调用mS.m_p=new int()怎么办代码>是否已执行<代码>删除[]
或delete
?@juanchopanza在我看来,原始指针通常在析构函数中返回它的资源。我delete[]
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; } };
- 如果使用
- 理想情况下,您根本不应该使用原始指针成员。您有两个更好的选择: