为什么删除运算符崩溃 [英] why delete operator crashes

查看:61
本文介绍了为什么删除运算符崩溃的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Hello Folks,

我需要按如下方式操作char字符串列表,但是当我想要

删除最后用new创建的指针时,删除操作员崩溃,任何

想法?


char * list [2000];

while(...)

{

list [MyCounter] = new char [Stringlength];

strncpy(list [MyCounter],c_TempFilename,Stringlength);

list [MyCounter] [Stringlength] =''\ 0'';

MyCounter ++;

}


for(i = 0; i< MyCounter; i ++)

{

delete [] list [i];

}


提前感谢大家。

Hello Folks,
I need to manipulate a list of char strings as follows, but when I want to
delete the pointer created with new at the end, delete operator crashes, any
idea?

char* list[2000];
while(...)
{
list[MyCounter] = new char [Stringlength];
strncpy(list[MyCounter], c_TempFilename, Stringlength);
list[MyCounter][Stringlength] = ''\0'';
MyCounter++;
}

for (i=0; i<MyCounter;i++)
{
delete [] list[i];
}

Thanks Everybody in advance.

推荐答案

Nemo写道:
Nemo wrote:
char * list [2000];


添加以下行:


断言(NULL == list [0]);


它可能会失败。


(它也可能通过,所以不要只依赖它。)

for(i = 0; i< MyCounter; i ++)
{
删除[]列表[i];
}
char* list[2000];
Add this line:

assert(NULL == list[0]);

It might fail.

(It also might pass, so don''t rely only on it.)
for (i=0; i<MyCounter;i++)
{
delete [] list[i];
}




您可以删除[] a空指针。但是你不应该删除一个

垃圾指针;一个包含未被new返回的未定义值。


所有未初始化的堆栈变量和堆变量都包含垃圾。总是

初始化,至少像这样:


char * list [2000] = {NULL};


现在学习使用std :: string并停止使用原始

指针编写高风险代码!


-

Phlip
http://www.greencheese.org/ZeekLand < - 不是博客!!!



You are allowed to delete[] a NULL pointer. But you should not delete a
garbage pointer; one containing an undefined value not returned by new.

All uninitialized stack variables and heap variables contain garbage. Always
initialize, at least like this:

char *list[2000] = { NULL };

Now learn to use std::string and stop writing high-risk code with raw
pointers!

--
Phlip
http://www.greencheese.org/ZeekLand <-- NOT a blog!!!


On Thu,2006年2月23日15:26:35 -0500,Nemo写道:
On Thu, 23 Feb 2006 15:26:35 -0500, Nemo wrote:
char * list [2000];
while(...)
{
list [MyCounter] = new char [Stringlength];


应该是:


list [MyCounter] = new char [Stringlength + 1];

strncpy( list [MyCounter],c_TempFilename,Stringlength);


....因为你最后坚持0。

list [MyCounter] [Stringlength] =''\'0' ';
MyCounter ++;
}
char* list[2000];
while(...)
{
list[MyCounter] = new char [Stringlength];
Should be:

list[MyCounter] = new char [Stringlength+1];
strncpy(list[MyCounter], c_TempFilename, Stringlength);
....since you''re sticking a 0 on the end.
list[MyCounter][Stringlength] = ''\0'';
MyCounter++;
}




- Jay



- Jay


在文章< dt**********@dns3.cae.ca> ;,Nemo < nemo@no_email.com>

写道:
In article <dt**********@dns3.cae.ca>, "Nemo" <nemo@no_email.com>
wrote:
Hello Folks,
我需要按如下方式操作char字符串列表,但是当我想要删除最后用new创建的指针时,删除操作符崩溃,任何想法?

char * list [2000];
while( ...)
{list [MyCounter] = new char [Stringlength];
strncpy(list [MyCounter],c_TempFilename,Stringlength);
list [MyCounter] [Stringlength ] =''\''';


关闭一个错误,列表[MyCounter]在[Stringlength]没有元素。

MyCounter ++;
}

for(i = 0; i< MyCounter; i ++)
{
删除[] list [i];
}
谢谢大家提前。
Hello Folks,
I need to manipulate a list of char strings as follows, but when I want to
delete the pointer created with new at the end, delete operator crashes, any
idea?

char* list[2000];
while(...)
{
list[MyCounter] = new char [Stringlength];
strncpy(list[MyCounter], c_TempFilename, Stringlength);
list[MyCounter][Stringlength] = ''\0'';
Off by one error, list[MyCounter] has no element at [Stringlength].
MyCounter++;
}

for (i=0; i<MyCounter;i++)
{
delete [] list[i];
}

Thanks Everybody in advance.




以上问题可能会破坏您删除的任何代码

运营商需要删除数组。


我强烈建议你使用std :: string。


std :: vector< std :: string>列表;

while(...)

{

list.push_back(std :: string(c_TempFilename));

}


//无需删除。

-

魔术取决于传统和信仰。它不欢迎观察,

也不会通过实验获利。另一方面,科学的经验基于
;它可以通过观察和实验进行校正。



The above problem is probably clobbering whatever code your delete
operator needs in order to delete the array.

I strongly suggest you use std::string.

std::vector<std::string> list;
while ( ... )
{
list.push_back( std::string( c_TempFilename ) );
}

// no delete needed.
--
Magic depends on tradition and belief. It does not welcome observation,
nor does it profit by experiment. On the other hand, science is based
on experience; it is open to correction by observation and experiment.


这篇关于为什么删除运算符崩溃的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆