vs c++释放内存问题

aizaiee 2016-03-14 06:09:10
#include<iostream>
#include<stdlib.h>
#include<string>
using namespace std;
int main()
{
char *p = new char[19];
if (NULL==p)
{
system("pause");
}
p = "hello !";
delete []p;
p = NULL;
system("pause");
return 0;

}
...全文
461 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
cjl-OTR 2016-03-20
  • 打赏
  • 举报
回复
你这样子做会造成内存泄漏的。char *p = new char[19];这样系统会在堆里面给你开辟一块内存。而p = "hello !";是把p指向一个全局内存叫做数据段。你觉得你去释放一个数据段的地址能不报错吗?
cocoabird 2016-03-20
  • 打赏
  • 举报
回复
 直接char p = "hello !";
szn_409 2016-03-20
  • 打赏
  • 举报
回复
strncpy(p, "hello !", 19); //对的 // p = "hello !"; //错的 好了,为什么这之后delete[]p; 会报错呢? 原因是:你在给p分配完内存后,p是指向你动态分配的内存,而当你执行p = "hello !";后,指针p的值就改变了,它不再继续指向你动态分配的内存,而是指向字符串常量 "hello !"的地址了,这里就造成了内存泄露,如果这时候进行了delete操作,那就是找死了,原因是字符串常量 "hello !"又不是动态分配的,你对它进行delete那不就崩溃了么 建议:去好好理解指针
super_admi 2016-03-15
  • 打赏
  • 举报
回复
p本身就是一个变量,为什么不可以给它赋值? 至于复制"hello",是指常量"hello"所在的首地址。
引用 5 楼 Citron09 的回复:
我也是新手。。一起讨论吧。。只说说我的见解。p是一个char数组指针。。p的值是数组第一个元素的值。。为什么能赋值hello?
paschen 版主 2016-03-15
  • 打赏
  • 举报
回复
没有new就不要用delete,只有动态分配的内存才需要释放
Citron09 2016-03-15
  • 打赏
  • 举报
回复
我也是新手。。一起讨论吧。。只说说我的见解。p是一个char数组指针。。p的值是数组第一个元素的值。。为什么能赋值hello?
Citron09 2016-03-15
  • 打赏
  • 举报
回复
引用 7 楼 super_admi的回复:
p本身就是一个变量,为什么不可以给它赋值? 至于复制"hello",是指常量"hello"所在的首地址。
引用 5 楼 Citron09 的回复:
我也是新手。。一起讨论吧。。只说说我的见解。p是一个char数组指针。。p的值是数组第一个元素的值。。为什么能赋值hello?
刚百度了下。。谢谢指点。学艺不精。。。
苦逼码农 2016-03-14
  • 打赏
  • 举报
回复
引用 3 楼 aizaiee 的回复:
你那种方法也不对啊
怎么不对? 你不用strcpy , memcpy的话,p指向了文字常量区的地址,文字常量区是由进程释放,不是由你手工delete。
aizaiee 2016-03-14
  • 打赏
  • 举报
回复
你那种方法也不对啊
aizaiee 2016-03-14
  • 打赏
  • 举报
回复
我就是想知道 为什么我那个样会报错 。。。。
yshuise 2016-03-14
  • 打赏
  • 举报
回复
p = "hello !"; ==================== strcpy(p,"hello");

65,186

社区成员

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

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