char*、new和delete联合使用的问题

原创 2012年03月22日 17:43:03

一个测试例子如下:

	char *strc = new char[5];
	strc[0] = '\0';
	strcat(strc,"12345");
	delete[] strc;


看似没问题,字符串strc分配空间正确并且将"12345”连接赋值给它。但是问题出现在这里:delete[] strc;

为什么呢?因为strc用new分配空间时在堆中有5个连续的字节,在将"12345”连接到它上面时,刚好有五个字符,每个占用一个字节。但是字符串的结尾符'\0'确因为堆分配空间不够而不能存放在strc的结尾。但这并不意味着strc的结尾处没有结束符'\0',实际上在最后一个字符'5'所在位置的下一个字节存放的就是'\0',但这个字节并不是由new来分配的。所以在用delete[] strc的时候是除了把"12345”所占用的五个字节回收之外,还会把'\0'所占用的字节回收掉,也就是回收了不是由new分配的空间,导致出错。

改成以下则不错:

	char *strc = new char[5];
	strc[0] = '\0';
	strcat(strc,"1234");
	delete[] strc;

 

char *p = new char[256]; delete p; / delete[] p; 哪个对 为什么

原帖地址:http://topic.csdn.net/u/20071027/12/a31bf228-7b4f-40b2-be41-e3b859f643d4.html char *p = ne...
  • yahohi
  • yahohi
  • 2011年08月31日 20:41
  • 2078

new和malloc的区别及内存管理及char[]与char*区别

1. malloc()函数 1.1 malloc的全称是memory allocation,中文叫动态内存分配。 原型:extern void *malloc(unsigned int num_byt...
  • Lu597203933
  • Lu597203933
  • 2015年03月10日 19:47
  • 2042

C++ 中new char[]()和C++ 中new char[]的区别

测试环境: vs210 windows 7 在C++ 中new char[]() 编译器默认将其初始化为0,new char[]则不会初始化。 #include using namespace s...
  • huangshanchun
  • huangshanchun
  • 2015年11月24日 10:22
  • 4676

char *p=new char

a只是个指针而以,它可以指向一个字符,也可以指向一个字符串。在第5行的时候,a指向的是一个一字节的char,但是在第6行的时候,a已经指向"abcde"了。所以输出的时候,就是"abcde"了。所以这...
  • zherowolf
  • zherowolf
  • 2010年10月16日 08:47
  • 12122

c++学习(五):new char[]的赋值

1.strcpy 2.memcpy 3.不能直接赋值为字符串常量。
  • sunnzhongg
  • sunnzhongg
  • 2016年12月03日 13:48
  • 1644

char *ch = new char; 与 char *ch = new char[10];

先上一段代码: char *ch = new char; ch = "abcd"; cout
  • u010276189
  • u010276189
  • 2016年02月25日 15:29
  • 605

浅谈 C++ 中的 new/delete 和 new[]/delete[]

在 C++ 中,你也许经常使用 new 和 delete 来动态申请和释放内存,但你可曾想过以下问题呢? new 和 delete 是函数吗?new [] 和 delete [] 又是什么?什么时候...
  • hazir
  • hazir
  • 2014年03月17日 22:49
  • 96443

【七】C++一些新的关键字 -- new、delete、强制类型转换

1、动态内存分配C++中的动态内存分配已经和C语言有了明显区别: C++中通过new关键字进行动态内存申请 C++中的动态内存申请是基于类型进行的 delete关键字用于内存释放   变量申请和释放...
  • CMbug
  • CMbug
  • 2015年08月23日 14:55
  • 1122

new和malloc的区别及内存管理及char[]与char*区别

1. malloc()函数 1.1 malloc的全称是memory allocation,中文叫动态内存分配。 原型:extern void *malloc(unsigned int num_byt...
  • Lu597203933
  • Lu597203933
  • 2015年03月10日 19:47
  • 2042

new出的对象数组必须要用delete[]删除,而普通数组和结构数组delete和delete[]都一样

为何new出的对象数组必须要用delete[]删除,而普通数组delete和delete[]都一样-----_CrtMemBlockHeader                            ...
  • Watson2016
  • Watson2016
  • 2016年10月25日 17:06
  • 3047
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:char*、new和delete联合使用的问题
举报原因:
原因补充:

(最多只允许输入30个字)