c++ 类中指针的释放(delete)

lsangame 2011-06-28 08:39:09
我的问题如下:
(1)一般在c++类中有成员指针的话,会在类的析构函数里释放(delete)这个指针?
(2)基于(1),如果传给这个成员指针不是一个堆分配的指针,那类发生析构会发生错误,这个怎么解决??
如下:

class A
{
public:
int *p;

~A()
{
delete p;
}
}

/----------------------------------
{
A a;
int b = 0;
a.p = &b;
}
/----------------------------------
对于上面将 b 的地址传给 a.p
当 a 出了它的作用域时会发生析构,调用~A(),而 p 指向不是一个 new 分配的内存,delete p 时会发生错误,
这样错误应该如何去避免???
诚望赐教!!!
...全文
2664 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
luckyxiaoxuan 2011-06-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wpalhm 的回复:]
你先学习下操作系统,了解堆和栈的区别。了解下c语言内存块。你自然就会明白为什么new要和delete对应。
[/Quote]
你说了等于没说。
lsangame 2011-06-30
  • 打赏
  • 举报
回复
结帖了
给20楼
写得很详细
新人第二次发帖,分数不多,海涵!!!
lsangame 2011-06-30
  • 打赏
  • 举报
回复
结帖了
给20楼了
因为写得很详细了
谢谢,新人第二次发贴,分数不多,海涵!!!
lsangame 2011-06-30
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 pathuang68 的回复:]
1. 一般的原则是,如果没有在构造函数中new,就不要在析构函数中delete。
2. 在楼主的代码中,由于没有在构造函数中new,所以也就不需要在析构函数中delete。
3. 但楼主说,代码如果是这样写的:

C/C++ code


A a;
int* b = new int(0);
a.p = b;


那是否可以在A的析构函数中写delete呢?理论上……
[/Quote]

嗯,看了你们说的这些,有些启发了,
看样子可以结贴了。
westboyxjk 2011-06-29
  • 打赏
  • 举报
回复
C++ primer 中明确指出:




使用delete 释放new申请的对象的时候,会自动调用析构函数


你怎么将delete 放在析构里面???



wjjll123 2011-06-29
  • 打赏
  • 举报
回复
大哥。别的我也不说了,不是new出来的就不要delete,那就避免了,都说一个萝卜一个洞。现在有萝卜,没有洞,你非要将萝卜往地上硬塞。只能把萝卜弄坏。。。
pathuang68 2011-06-29
  • 打赏
  • 举报
回复
1. 一般的原则是,如果没有在构造函数中new,就不要在析构函数中delete。
2. 在楼主的代码中,由于没有在构造函数中new,所以也就不需要在析构函数中delete。
3. 但楼主说,代码如果是这样写的:

A a;
int* b = new int(0);
a.p = b;

那是否可以在A的析构函数中写delete呢?理论上说也是可以的,但是最好不要这样做,在类外面new的,那么也就请在类的外面delete,也就是说,上面代码应该写成:

A a;
int* b = new int(0);
a.p = b;
// ... 使用b
delete b;


4. 因此,new和delete的对称性包含两方面的含义:
a. new和delete要成对出现。
b. 出现的位置,应当处于同一个层面。
autumn_xl 2011-06-29
  • 打赏
  • 举报
回复
建议楼主看看C++Primer 中有关智能指针那部分的知识。在类中 有指针这样的成员变量有事处理起来很麻烦的,最好不直接使用 int *p;这类变量.
wqw_dream 2011-06-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bdmh 的回复:]

你这个指针又不是通过new分配的,你干嘛 用delete,没有new就别用delete
[/Quote]

有New才有Delete
5t4rk 2011-06-29
  • 打赏
  • 举报
回复
对啊。
析构函数就是
用来清理对象
所包含的成员new出来的
内存空间。你用它肯定不行的

lsangame 2011-06-29
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 fengzhw 的回复

其实你自己考虑到的情况2,就已经解释了为什么情况1是不妥当的。
从而,C++对象在析构的时候,会析构成员对象,但绝对不会擅自去delete任何一个指针。

对这种情况,有个基本的原则:谁new,谁delete;
也有一种特殊的带引用计数器的指针对象,但是也并非是别人delete,
而是在不使用的时候发出一个减少引用计数的调用,当计数器降为0的时候,由这个对象自己delete。

[/Quote]

感觉你说的
“对这种情况,有个基本的原则:谁new,谁delete;”
很有道理,有点启发。
KevinHo 2011-06-28
  • 打赏
  • 举报
回复
这取决于是否在构造函数里new了这个指针。如果new了就需要在析构函数里delete这个指针。
new分配的内存单元在堆区,这个区域的单元块必须靠用户显式地释放,否则系统不会自己回收。
可见,析构函数不可能自己自动delete的指针。
鄢老 2011-06-28
  • 打赏
  • 举报
回复
抱歉,我看成delete this了,不过delete p时,p如果不是动态申请的,那就要崩溃了
楼主,你的结帖率为0%,要注意及时结贴啊。
鄢老 2011-06-28
  • 打赏
  • 举报
回复
呵呵,delete一次后,就调一次析构,而调析构的时候,又调delete,死循环啊。
luciferisnotsatan 2011-06-28
  • 打赏
  • 举报
回复
b是栈上变量,自动释放,不能delete。
delete要和new配对使用
就想叫yoko 2011-06-28
  • 打赏
  • 举报
回复
那就要你自己控制好代码了 要知道 并不是说所有代码都是别人写的 而且不给你看 让你写个析构出来
不是new就别在析构中delete了, 另外delete之前 if (p != NULL)
delete之后 p = NULL;
fengzhw 2011-06-28
  • 打赏
  • 举报
回复
[Quote=引用楼主 lsangame 的回复:]
我的问题如下:
(1)一般在c++类中有成员指针的话,会在类的析构函数里释放(delete)这个指针?
(2)基于(1),如果传给这个成员指针不是一个堆分配的指针,那类发生析构会发生错误,这个怎么解决??
如下:

class A
{
public:
int *p;

~A()
{
delete p;
}
}

……
[/Quote]

其实你自己考虑到的情况2,就已经解释了为什么情况1是不妥当的。
从而,C++对象在析构的时候,会析构成员对象,但绝对不会擅自去delete任何一个指针。

对这种情况,有个基本的原则:谁new,谁delete;
也有一种特殊的带引用计数器的指针对象,但是也并非是别人delete,
而是在不使用的时候发出一个减少引用计数的调用,当计数器降为0的时候,由这个对象自己delete。
wpalhm 2011-06-28
  • 打赏
  • 举报
回复
你先学习下操作系统,了解堆和栈的区别。了解下c语言内存块。你自然就会明白为什么new要和delete对应。
sjy88813 2011-06-28
  • 打赏
  • 举报
回复
恩,析构函数为空就行了。。啥都不用写
风吹PP凉SS 2011-06-28
  • 打赏
  • 举报
回复
+1

[Quote=引用 1 楼 bdmh 的回复:]
你这个指针又不是通过new分配的,你干嘛 用delete,没有new就别用delete
[/Quote]
加载更多回复(6)

64,702

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧