指针不是指向new出来的内存,如何释放?

xiaojunjun1202 2011-09-02 03:29:01

PWORD tmpPwd = NULL;
DWORD d = 4666;
tmpPwd = (PWORD)(&d);

//if (tmpPwd)
//{
//delete(tmpPwd);
//tmpPwd = NULL;
//}


像上面tmpPwd这样的情况,不是指向new出来的内存块,怎样释放?类似的还有FILE* f等等。
...全文
833 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
chen_ya_ping 2011-09-02
  • 打赏
  • 举报
回复
要么指向对的new,要么就不管了,等操作系统来吧。
kingcard 2011-09-02
  • 打赏
  • 举报
回复
楼主还是没分清堆和栈的关系。
new 出来的内存是在堆中,需要对应的 delete 去释放。
而 PWORD tmpPwd = &d 表达式中,编译器会为 tmpPwd 指针分配一个内存空间(比如在 32位系统中为 4 字节),这个内存空间存在于栈中,随着其 tmpPwd 变量的生命周期终结(e.g. 函数执行完成)而自动释放(这个自动释放也是编译器做的事,跟你没关系)。
所以,你以后只管释放你分配的内存,不是你分配的内存就不管理,Understand?
PG 2011-09-02
  • 打赏
  • 举报
回复
我擦~~
不用~
ken_scott 2011-09-02
  • 打赏
  • 举报
回复
不是堆上申请(new, malloc..)的就不能手动释放(delete, free)
另外, new不一定是申请了内存, 也许只是创建了一个对象

题外话

#include<iostream>
using std::cout;
using std::endl;

int main()
{
int a = 0;
char * b = new(&a)char; // code 1
*b = 123;
cout << *b << ' ' << a << endl;
b = NULL;

int * c = new int(456); // code 2
cout << *c << endl;
delete c;
c = NULL;

return 0;
}

其中
code 1是在a的地址是创建了一个对象b, 但没有申请内存, 也即a, b共享了一个字节的内存
code 2是先申请了一个字节的内存, 再在这个字节的内存上创建一个对象c

因为b所在的内存就是a中的一部分, a是栈上的内存, 不能手动释放(就算a是堆上的内存, 也应该让a自己去释放), 而c是申请的堆上的内存, 要自己释放

总之, 谁申请谁释放, 没申请就别释放, google "placement new, operator new and new operator"
我也只是了解
needallcodes 2011-09-02
  • 打赏
  • 举报
回复
操作系统内存 -> c程序管理的内存 -> 程序员使用的内存 -> 堆内存,栈空间,寄存器
AndyZhang 2011-09-02
  • 打赏
  • 举报
回复
我倒感觉这样解释也行,你定义的指针变量,编译的时候系统给你分配空间,既然是系统自动给的,它自己知道怎么去处理。。如果是你通过new,malloc动态申请的,既然是你手动申请的,那么用完你去delete处理。


其实本质上就看你的内存空间分配在那里?是栈还是堆,栈的话,自己会走到最开始的地方,那么,你申请的也就自动释放了,堆的话就要手动申请和释放了。可以看一下堆栈的原理。
十八道胡同 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xiaojunjun1202 的回复:]

引用 6 楼 shi3590 的回复:
申请空间在栈上,函数运行完自动回收。
new/malloc是申请堆上空间,需要人为回收,对应delete/free


那用了诸如 FILE* f,PWORD tmpPwd ;
这些我们就不管了呀?
[/Quote]
这些个是变量 ,内存分配在栈上,有编译器负责回收

你自己申请的在堆上,需要你自己回收
Jokul_Lee 2011-09-02
  • 打赏
  • 举报
回复
我回的贴怎么没了?
赵4老师 2011-09-02
  • 打赏
  • 举报
回复
要象用fopen、fclose那样用
malloc、free
new、delete
type *v=new type[n]、delete[] v
shi3590 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xiaojunjun1202 的回复:]
引用 6 楼 shi3590 的回复:
申请空间在栈上,函数运行完自动回收。
new/malloc是申请堆上空间,需要人为回收,对应delete/free


那用了诸如 FILE* f,PWORD tmpPwd ;
这些我们就不管了呀?
[/Quote]
是的。不用管。
xiaojunjun1202 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 huayehanshan 的回复:]
C/C++ code




PWORD tmpPwd= NULL;
0041139E mov dword ptr [tmpPwd],0
int d = 4666;
004113A5 mov dword ptr [d],123Ah
tmpPwd = (PWORD)(&d);
004113AC lea ……
[/Quote]


高人啊
早听说单步千行不如单步汇编一行
只是汇编水平实在太次
叶落寒山 2011-09-02
  • 打赏
  • 举报
回复



PWORD tmpPwd= NULL;
0041139E mov dword ptr [tmpPwd],0
int d = 4666;
004113A5 mov dword ptr [d],123Ah
tmpPwd = (PWORD)(&d);
004113AC lea eax,[d]
004113AF mov dword ptr [tmpPwd],eax

tmpPwd与d指向同一块内存,delete tmpPwd 等于删除变量d。所以tmpPwd不用释放


troyXyz 2011-09-02
  • 打赏
  • 举报
回复
栈上的不用释放 
limang89 2011-09-02
  • 打赏
  • 举报
回复
Solmyr 的小品文系列之五 垃圾收集

推荐一篇文章 看看吧。。。
xiaojunjun1202 2011-09-02
  • 打赏
  • 举报
回复
结贴。。。
xiaojunjun1202 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 shi3590 的回复:]
申请空间在栈上,函数运行完自动回收。
new/malloc是申请堆上空间,需要人为回收,对应delete/free
[/Quote]

那用了诸如 FILE* f,PWORD tmpPwd ;
这些我们就不管了呀?
Jokul_Lee 2011-09-02
  • 打赏
  • 举报
回复
不用释放,,并不是说指针指向的内存就需要释放。
而是你申请内存的方式不同,决定的是否需要释放内存。
new和malloc申请的内存,可以理解成手动申请,所以需要手动释放。
char abc[100];这种都属于自动申请,所以程序自动释放。
xiaojunjun1202 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 pengzhixi 的回复:]
没new就没delete
[/Quote]

那用了诸如 FILE* f,PWORD tmpPwd ;
这些我们就不管了呀?
shi3590 2011-09-02
  • 打赏
  • 举报
回复
申请空间在栈上,函数运行完自动回收。
new/malloc是申请堆上空间,需要人为回收,对应delete/free
pengzhixi 2011-09-02
  • 打赏
  • 举报
回复
没new就没delete
加载更多回复(4)

65,209

社区成员

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

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