Release正常,Debug错误的LocalPointer问题

Herowuking 2008-01-03 09:30:16

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

char *GetString(void)
{
char *p = new char[20];
p = "Hello,I am a string.\n";
return p;
}

int main()
{
char *q = GetString();
cout<<q<<endl;
delete []q; //我知道这样不好,但是我只是想测试一下函数返回值为指针的情况
//是否一定不能返回函数内部局部变量的指针或者引用呢??
return 0;
}

上面的代码在Release模式下正常但是在Debug模式下出现“Debug Assertion Failed”,不知为何?
如果函数返回值为指针或者引用的时候是否一定不可以返回局部变量的指针或者引用??
...全文
179 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
goodbee 2008-01-07
  • 打赏
  • 举报
回复
--> delete[] p;
尝试释放常量内存"Hello, I am a string.\n",在debug下引发错误,被IDE截获显示错误对话框。
在release版本下同样引发错误,由于没人处理这个错误, 系统自动调用默认错误处理过程,即终止程序运行。 巧合的是你的程序正好也该结束了, 这个巧合使你认为release版没有错误发生


realease版本会终止程序么?楼主可以测试一下~ ,并不一定吧?
goodbee 2008-01-07
  • 打赏
  • 举报
回复
--> delete[] p;
尝试释放常量内存"Hello, I am a string.\n",在debug下引发错误,被IDE截获显示错误对话框。
在release版本下同样引发错误,由于没人处理这个错误, 系统自动调用默认错误处理过程,即终止程序运行。 巧合的是你的程序正好也该结束了, 这个巧合使你认为release版没有错误发生


realease版本会终止程序么?楼主可以测试一下~ ,并不一定吧?
阿呆_ 2008-01-03
  • 打赏
  • 举报
回复
-->char *p = new char[20];
系统分配一块内存,该内存占用20字节,然后将该内存首地址赋值给p

--〉p= "Hello, I am a string.\n";
系统将常量字符串"Hello, I am a string.\n"(也是一块内存,不过该内存存储于程序常量区)首地址赋值给p, 同时刚分配的那20字节内存成为内存变成无人引用,形成内存泄漏。

-->delete[] p;
尝试释放常量内存"Hello, I am a string.\n",在debug下引发错误,被IDE截获显示错误对话框。
在release版本下同样引发错误,由于没人处理这个错误, 系统自动调用默认错误处理过程,即终止程序运行。 巧合的是你的程序正好也该结束了, 这个巧合使你认为release版没有错误发生
Herowuking 2008-01-03
  • 打赏
  • 举报
回复
To aspnetwuxueyou:
能留个QQ号码联系一下吗?有问题请教。我的号码:442448734
我刚才试了一下const指针,还是出错。看来“char *p = new char[20]; p = "Hello,I am a string.\n";”
是有问题,但是还是不太明白:

#include <iostream>
using namespace std;

int main()
{
const char *p = new char[20];
p = "Hello, I am a string.\n";
cout<<p<<endl;
delete [] p;

return 0;
}

编译报错:
Compiling...
constNewPointer.cpp
D:\Study\C++\constNewPointer\constNewPointer.cpp(9) : error C2665: 'delete' : none of the 2 overloads can convert parameter 1 from type 'const char *'
执行 cl.exe 时出错.

constNewPointer.exe - 1 error(s), 0 warning(s)

如去掉const关键字则又是在Release模式下能够通过编译,在Debug模式下还是Debug Assertion Failed错误。
希望继续指点明白,加分感谢!
aspnetwuxueyou 2008-01-03
  • 打赏
  • 举报
回复
这是调试保护。p指向的地方只要不是系统保护的,在release下都可以调用delete,但是这样是不对的。
另外,常量指针也可以delete呀
Herowuking 2008-01-03
  • 打赏
  • 举报
回复
继续等待高手出现....
Herowuking 2008-01-03
  • 打赏
  • 举报
回复
执行完

char *p = new char[20];
p = "Hello,I am a string.\n";

之后,p是指向常量的指针了,但是p不是常量指针啊,为什么不能delete?
“指向常量的指针”不能和“常量指针”混淆吧
aspnetwuxueyou 2008-01-03
  • 打赏
  • 举报
回复
1. release下怎么会正常呢?你没有看到错误而已,不代表正常
2. 返回引用的话,局部变量的生存周期会延长,但建议不要这么使用。指针就不对了。
Herowuking 2008-01-03
  • 打赏
  • 举报
回复
非常感谢aspnetwuxueyou的回复,但是我的问题是:
1.为什么在Release模式下正常,只是在Debug模式下出现“Debug Assertion Failed”错误??
2.如果函数返回值为指针或者引用的时候是否一定不可以返回局部变量的指针或者引用??
aspnetwuxueyou 2008-01-03
  • 打赏
  • 举报
回复
p = "Hello,I am a string.\n";
执行完上面的语句你就会发现p的指针改变了,根本不是你new char[20]那个指针。
p是指向常量的指针了(编译处理),你再delete肯定不行了
aspnetwuxueyou 2008-01-03
  • 打赏
  • 举报
回复
char *p = new char[20];
p = "Hello,I am a string.\n";
绝对错误
Herowuking 2008-01-03
  • 打赏
  • 举报
回复
谢谢IDle_的回复,我明白了为什么错误了;
同时感谢热情回帖的aspnetwuxueyou
分数已经送出!
Herowuking 2008-01-03
  • 打赏
  • 举报
回复
谢谢IDle_的回复,我明白了为什么错误了;
同时感谢热情回帖的aspnetwuxueyou
分数已经送出!
aspnetwuxueyou 2008-01-03
  • 打赏
  • 举报
回复
串不能这样赋值
要用strcpy,用StringCchCopy更好。
我不用qq,我的msn是xueyw@hotmail.com

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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