关于new一个字符串,然后delete的问题

qq20004604
博客专家认证
2016-01-06 10:45:16
直接上代码吧。
一个new一个delete是符合规定的,但是我这个delete提示出错。

问题①请问是否是因为m是一个字符数组?所以new出来了多个m指针?比如m[0],m[1]等?
——我觉得应该是吧?

问题②那么正确的代码用n指向这个指针数组,然后delete[]m 能否删除干净这些?
——我不确定了

问题③我又发现在代码3的情况下,又不会出错。
——所以我推测是因为我直接给m赋值字符串了?

问题④所以正常应该先new一个,然后创建另外一个char指针,然后这个指针指向字符串,然后再把这个指针赋值给new出来的那个指针,然后再delete 指针是正确的?

问题⑤假如代码2,那么delete[]m和delete[]n有什么区别?

代码1:

//有错的代码
#include<iostream>
using namespace std;

int main()
{
char *m = new char[6];
m = "abc";
cout << m << endl;
delete[]m; //这行代码提示出现断点
system("pause");
return 0;
}



代码2:

//没有错误的代码
#include<iostream>
using namespace std;

int main()
{
char *m = new char[6];
char *n = m;
n = "abc"; //这里用m赋值的话,就无法正常显示了,请问为什么?
cout << n << endl;
delete[]m;
system("pause");
return 0;
}


代码3:
	char *m = new char[6];
m[0] = 'a';
m[1] = 'b';
m[2] = 'c';
m[3] = '\0';
cout << m << endl;
delete[]m;
...全文
305 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-01-07
  • 打赏
  • 举报
回复
理解讨论之前请先学会如何观察! 计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程! 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步Debug版对应汇编一行! 单步Debug版对应汇编千行不如单步Release版对应汇编一行! 不会单步Release版对应汇编?在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有,然后在IDE中运行。(一般人我不告诉他!单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
paschen 2016-01-07
  • 打赏
  • 举报
回复
引用 3 楼 qq20004604 的回复:
[quote=引用 1 楼 paschen 的回复:] 因为你的m = "abc"; 已经让m重新指向了常量区的字符串"abc"了 如果你是要让分配的内存内容为"abc",你要用strcpy复制进去
那delete []m 是什么意思?是清空储存指针m这个内存地址的值呢?还是清空指针m指向地址的值?[/quote] delete[] m 就是释放m指针指向的内存,你指向的是常量区的,不需要释放,你new的那一块如果用n保存了,可以delete[] n ,否则就丢失了,释放不了了
lm_whales 2016-01-07
  • 打赏
  • 举报
回复
delete,delete [] 意思是销毁其上的对象,并归还,当初new 分配的,不再需要使用的内存, 使得这块内存,重新变成内存管理程序, 可以重新安排的内存,从而可以下次再分配使用。 new,new [] 意思是获得一块可以使用的内存,在其上创建对象,并登记在册。以便归还,以及分配剩余内存。 这块内存 的位置(地址值),可以用一个指针保存。
lm_whales 2016-01-07
  • 打赏
  • 举报
回复
new ,delete 应该一一对应 delete 的一定是new 出来的地址(或者是NULL),不能是别的东西。 delete 只关心地址,数据类型 ,而不管指针变量叫什么名字。 new ,delete new[],delete[] 要对应。 delete [] 可以从地址获得 分配的对象多少的信息。 所以不必传递对象个数 也正因为如此,不是new [] 分配的地址,不能施加 delete[];
zhouxiaofeng1021 2016-01-07
  • 打赏
  • 举报
回复
直接上代码吧。 一个new一个delete是符合规定的,但是我这个delete提示出错。 问题①请问是否是因为m是一个字符数组?所以new出来了多个m指针?比如m[0],m[1]等? ——我觉得应该是吧? 这个问题,不懂你问的是啥,就不会回答了哈 问题②那么正确的代码用n指向这个指针数组,然后delete[]m 能否删除干净这些? ——我不确定了 new 对应delete new[]对应delete[] 即可 问题③我又发现在代码3的情况下,又不会出错。 ——所以我推测是因为我直接给m赋值字符串了? 嗯嗯 ,你对指针的赋值运行理解有误 问题④所以正常应该先new一个,然后创建另外一个char指针,然后这个指针指向字符串,然后再把这个指针赋值给new出来的那个指针,然后再delete 指针是正确的? 赋值 可用memcpy或者strcpy 你犯了一个严重的错误,就是指针赋值 = 仅仅只是改变指针指向的位置而已,而不是改变其内容 问题⑤假如代码2,那么delete[]m和delete[]n有什么区别? 有区别 m指向 new char[6]; n 指向 "abc"; 你cout << m<< endl; 试试? 代码1:

//有错的代码
#include<iostream>
using namespace std;

int main()
{
	char *m = new char[6];
	m = "abc";   //这里指针变了,不再指向new char[6]的位置,而是静态常量区地址~~~
	cout << m << endl;
	delete[]m;	//这行代码提示出现断点 //所以delete失败
	system("pause");
	return 0;
}
代码2:

//没有错误的代码
#include<iostream>
using namespace std;

int main()
{
	char *m = new char[6];
	char *n = m;
	n = "abc";   //这里用m赋值的话,就无法正常显示了,请问为什么?
	cout << n << endl;
	delete[]m;   //这里m的指向的地址没有变化啊,依旧是new char[6];  所以不会有问题
	system("pause");
	return 0;
}
代码3: [code=c] char *m = new char[6]; m[0] = 'a'; m[1] = 'b'; m[2] = 'c'; m[3] = '\0'; cout << m << endl; delete[]m;[/code //没有问题哦,m的地址依旧没变,还是new char[6]; 数组蜕化后可成指针
qq20004604 2016-01-07
  • 打赏
  • 举报
回复
大概懂了。 我犯了以下几个错误: ①把new和delete 记成new 和delete[] 了。所以纠结了半天,实际上,我new char[] 就要用delete[] 来删除 ②没理解好delete的意义,按照版主所说,new是new了一个地址出来,delete是删除指针指向的new出来的地址,所以说,如果new出来的地址,由两个同类型的指针指向他,那么删除哪个都是一样的 ③用指针指向字符串,实际是用指针指向一个常量字符串的地址,并不是将字符串赋值给指针。 ④例如这样的是赋值:
	char *a = new char[3];
	a[0] = 'a';
	a[1] = 'b';
	a[2] = '\0';
	delete a;
而a="ab"; 是给指针a赋地址。 我之前把赋值和地址搞错了
qq20004604 2016-01-06
  • 打赏
  • 举报
回复
应该是后者吧?
qq20004604 2016-01-06
  • 打赏
  • 举报
回复
引用 1 楼 paschen 的回复:
因为你的m = "abc"; 已经让m重新指向了常量区的字符串"abc"了 如果你是要让分配的内存内容为"abc",你要用strcpy复制进去
那delete []m 是什么意思?是清空储存指针m这个内存地址的值呢?还是清空指针m指向地址的值?
qq20004604 2016-01-06
  • 打赏
  • 举报
回复
引用 1 楼 paschen 的回复:
因为你的m = "abc"; 已经让m重新指向了常量区的字符串"abc"了 如果你是要让分配的内存内容为"abc",你要用strcpy复制进去
呀!是因为这个原因啊? 所以delete这个指针会出错?因为delete错了? 所以要逐个赋值字符,才不会指向常量字符串? 那如何输出指针指向的地址?用运算符重载?我马上看到这部分内容的知识了
paschen 2016-01-06
  • 打赏
  • 举报
回复
因为你的m = "abc"; 已经让m重新指向了常量区的字符串"abc"了 如果你是要让分配的内存内容为"abc",你要用strcpy复制进去

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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