char * 的 delete 问题,看见运行结果当场纠结了~

neicole 2012-08-21 08:54:18
纠结。。。 这个 char * 该如何创建如何delete的好啊,上网查过资料说是new和delete比较好,
结果自己稍做了一下测试,我纠结了,内存是昨回收的呢? delete为什么会失败了呢?

// Code::Blocks 8.02 +  mingw32-g++.exe

#include <iostream>
#include <string>

using namespace std;

int main()
{
// 初始化变量
const char text[] = "const char"; // 长度为10+1
char p1 [] = "I'm p1"; // 长度为6+1
char * p2 = new char[100]; p2 = "I'm P2"; // 长度为5或100
char * p3 = (char*)malloc(100); p3 = "I'm P3";// 长度为5或100

// 显示参数
cout << "After Construct && Before Delete\n";
cout << "name" << "\t" << "Address" << "\t\t" << "Length" << "\t" << "Details" << endl
<< "text[]" << "\t" << &text << "\t" << sizeof(text) << "\t" << text << endl
<< "p1" << "\t" << &p1 << "\t" << strlen(p1) << "\t" << p1 << endl
<< "p2" << "\t" << &p2 << "\t" << strlen(p2) << "\t" << p2 << endl
<< "p3" << "\t" << &p3 << "\t" << strlen(p3) << "\t" << p3 << endl
<< endl;

// 使用delete或者free删除
delete [] text; delete text; // 纠结,为什么delete个const也不提示错啊
delete [] p1; delete p1; // 重复delete这么多次也不报错?
delete [] p2; delete p2;
delete [] p3; free(p3); delete p3;

// 显示参数 昨delete过后也还能继续运行啊?不报错也能正常显示数据?
cout << "After Construct && Before Delete\n";
cout << "name" << "\t" << "Address" << "\t\t" << "Length" << "\t" << "Details" << endl
<< "text[]" << "\t" << &text << "\t" << sizeof(text) << "\t" << text << endl
<< "p1" << "\t" << &p1 << "\t" << strlen(p1) << "\t" << p1 << endl
<< "p2" << "\t" << &p2 << "\t" << strlen(p2) << "\t" << p2 << endl
<< "p3" << "\t" << &p3 << "\t" << strlen(p3) << "\t" << p3 << endl
<< endl;
return 0;
}

/********** 结果 ****************
****************


After Construct && Before Delete
name Address Length Details
text[] 0x28ff20 11 const char
p1 0x28ff10 6 I'm p1
p2 0x28ff0c 6 I'm P2
p3 0x28ff08 6 I'm P3

After Construct && Before Delete
name Address Length Details
text[] 0x28ff20 11 const char
p1 0x28ff10 6 I'm p1
p2 0x28ff0c 6 I'm P2
p3 0x28ff08 6 I'm P3


Process returned 0 (0x0) execution time : 0.140 s
Press any key to continue.

*****************************************************/


正常编译通过了。。。

char 数组 该如何新建如何删除是好呢? 求意见~
基础问题,大家都来围观啊啊啊~
...全文
598 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxwswjtu 2014-08-07
  • 打赏
  • 举报
回复
引用 13 楼 yazinihao 的回复:
同楼主一样的错误,还有 char * p1 = new char [10]; char * p2 = new char [sizeof(p1)]; strcpy(p2, p1); 也会有问题
sizeof(p1)代表的是p1是char*类型的,占1个字节 sizeof(p1)=1; 所以strcpy(p2,p1)是把10个字节的内容拷贝到1个字节的内存中,所以出错。
yazinihao 2014-07-05
  • 打赏
  • 举报
回复
同楼主一样的错误,还有 char * p1 = new char [10]; char * p2 = new char [sizeof(p1)]; strcpy(p2, p1); 也会有问题
neicole 2012-08-25
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]
引用 9 楼 的回复:

char * p2 = new char[100]; p2 = "I'm P2"; // 长度为5或100
char * p3 = (char*)malloc(100); p3 = "I'm P3";// 长度为5或100
在=操作符没重载之前不能这样赋值吧楼主 除非你的意愿不是要复制


char*指针类型可以理解为一般的内置类型,内置类型怎么重载赋值操作……
[/Quote]

噢,是喔,刚刚上网搜了一下~
http://www.cnblogs.com/xiangxiaodong/archive/2012/02/12/2348144.html

运算符重载的七个限制,其中第二条提到了。

(1) 只有C++预定义的操作符集中的操作符才可以被重载;


(2)对于内置类型的操作符,它的预定义不能被改变,应不能为内置类型重载操作符,如,不能改变int型的操作符+的含义;

(3) 也不能为内置的数据类型定义其它的操作符;

(4) 只能重载类类型或枚举类型的操作符;

(5) 重载操作符不能改变它们的操作符优先级;

(6) 重载操作符不能改变操作数的个数;

(7) 除了对( )操作符外,对其他重载操作符提供缺省实参都是非法的;



xingfeng2510 2012-08-21
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

char * p2 = new char[100]; p2 = "I'm P2"; // 长度为5或100
char * p3 = (char*)malloc(100); p3 = "I'm P3";// 长度为5或100
在=操作符没重载之前不能这样赋值吧楼主 除非你的意愿不是要复制
[/Quote]

char*指针类型可以理解为一般的内置类型,内置类型怎么重载赋值操作符?我记得内置类型不能重载赋值操作符。
neicole 2012-08-21
  • 打赏
  • 举报
回复

[Quote=引用 7 楼 的回复:]
逐字节copy, 调用memcpy或strcpy函数即可
[/Quote]
再次感谢。。。 这下子明白了。


[Quote=引用 8 楼 的回复:]
刚才试了下,gcc与vc编译器均可以编译通过,但运行时出现运行时错误且均因内存地址不可读或堆栈被破坏而终止运行。不知为何lz的Code Blocks下的gcc可以运行?
[/Quote]
至于为啥我的Code Blocks运行没问题就不管了。。。 纠结。。 下次还是多个编译器试试。

[Quote=引用 9 楼 的回复:]
char * p2 = new char[100]; p2 = "I'm P2"; // 长度为5或100
char * p3 = (char*)malloc(100); p3 = "I'm P3";// 长度为5或100
在=操作符没重载之前不能这样赋值吧楼主 除非你的意愿不是要复制
[/Quote]

噢,这仁兄提醒我了,可以运算符重载解决问题。


谢谢大家~结贴结贴~
SKATE11 2012-08-21
  • 打赏
  • 举报
回复
char * p2 = new char[100]; p2 = "I'm P2"; // 长度为5或100
char * p3 = (char*)malloc(100); p3 = "I'm P3";// 长度为5或100
在=操作符没重载之前不能这样赋值吧楼主 除非你的意愿不是要复制
xingfeng2510 2012-08-21
  • 打赏
  • 举报
回复
刚才试了下,gcc与vc编译器均可以编译通过,但运行时出现运行时错误且均因内存地址不可读或堆栈被破坏而终止运行。不知为何lz的Code Blocks下的gcc可以运行?
xingfeng2510 2012-08-21
  • 打赏
  • 举报
回复
逐字节copy, 调用memcpy或strcpy函数即可
neicole 2012-08-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
正常编译通过了?虽然可以编译通过,但一路warning,且会出现运行时错误,无论是vc编译器还是gcc编译器都不会让你顺利的运行,因为delete栈上分配的变量是c++编程中的大忌,一定要切记。
[/Quote]

p2 = "I'm P2";这一行会修改p2指针变量自身的值,使其等于静态字符串“I'm P2”的首地址
原来是这样~ 感谢。。又发现一个没有想过的问题。。

运行没错误。。 这是因为什么问题呢?

那我该如何才能用上分配好的内存呢?
xingfeng2510 2012-08-21
  • 打赏
  • 举报
回复
正常编译通过了?虽然可以编译通过,但一路warning,且会出现运行时错误,无论是vc编译器还是gcc编译器都不会让你顺利的运行,因为delete栈上分配的变量是c++编程中的大忌,一定要切记。
neicole 2012-08-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
const char text[] = "const char";
char p1 [] = "I'm p1";
char * p2 = new char[100]; p2 = "I'm P2";
char * p3 = (char*)malloc(100); p3 = "I'm P3";
短短几行代码存在很多潜在的错误。text、p1均为字符数组,作为临时变量分配在栈上,delete [……
[/Quote]

谢谢~ 认真一看,还发觉真是。。
In function `int main()':
warning: deleting array `const char text[11]'
warning: deleting array `const char text[11]'
warning: deleting array `char p1[7]'
warning: deleting array `char p1[7]'

text和p1明白了。、

不过还是不明白为什么 p2和p3能多次delete? delete后数据还会保留?
xingfeng2510 2012-08-21
  • 打赏
  • 举报
回复
char * p2 = new char[100]; p2 = "I'm P2";
char * p3 = (char*)malloc(100); p3 = "I'm P3";
delete [] p2; delete p2;
delete [] p3; free(p3); delete p3;
这几行存在内存泄露现象,char * p2 = new char[100];p2指向所分配堆内存块的首地址,而p2 = "I'm P2";这一行会修改p2指针变量自身的值,使其等于静态字符串“I'm P2”的首地址,lz可以调试下,可以观察到p2值的变化,这么delete [] p2; delete p2;还会删除掉原先在堆内存分配的100个字节么? 当然不会。所以终止会导致内存泄露的发生。
xingfeng2510 2012-08-21
  • 打赏
  • 举报
回复
const char text[] = "const char";
char p1 [] = "I'm p1";
char * p2 = new char[100]; p2 = "I'm P2";
char * p3 = (char*)malloc(100); p3 = "I'm P3";
短短几行代码存在很多潜在的错误。text、p1均为字符数组,作为临时变量分配在栈上,delete [] text;操作无论是在vc++还是gcc中都会报出类似"warning C4154: 删除数组表达式;转换到提供的指针"的警告,而delete text;在vc++中会出现“ warning C4156: 未使用数组形式的“delete”删除数组表达式;数组形式被替代”的警告,除了数组类型外的其他类型如果显示delete掉栈上的分配的临时变量都会出现运行时错误,因为delete操作只适用于堆内存,这里delete临时数组只是给出了警告而已,其实delete该数组对该数组没有什么影响,原有的数据也不会丢失。因此,lz犯了原则性错误。

64,282

社区成员

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

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