c++ delete[]编译错误

语句delete[]a出现编译错误:errorC2665:'delete':noneofthe2overloadscanconvertparameter1fromtype... 语句 delete[] a
出现编译错误: error C2665: 'delete' : none of the 2 overloads can convert parameter 1 from type 'const unsigned char *'
请问应如何修改?

编译器VC++ 6.0
加了(char*)还是报错
展开
 我来答
STAR_孙
2010-06-16 · TA获得超过177个赞
知道答主
回答量:63
采纳率:0%
帮助的人:48.3万
展开全部
我找到一个此类问题的讨论贴,看你有没帮助吧
【HewpKanXue】:
你什么编译器阿?换Vs2005、dev_cpp试下。

【gjw310】:
const char *ch=new char[20];
delete [](char *)ch;
这样不会报错的

【akirya】:
const char *ch=new char[20];这样动态申请的时候你怎么使用啊?
内容是不可改写的.

【gjw310】:
例子:
char const *ch=new char[20];
memset((char *)ch,'E',20);
cout<<ch<<endl;

delete [](char *)ch;

【jixingzhong】:
char * const ch=new char[20]; //楼主你的本意是不是应该这样?
delete [] ch;

【jixingzhong】:
const char *ch=new char[20]; 这样申请的空间无法使用!(内容无法修改)

char * const ch=new char[20]; 可以使用空间,但是 ch 指向不允许修改,这个比较合理

【yixiao386】:
同意上面的

【believefym】:
vs2005貌似可以的

【wanfustudio】:
可以归可以

最好不要这么搞,内容不可改,没什么用处
要是修饰指针还可以

【yoyo_alex_lw】:
注意const 在*的前面还是后面,在前面,指针指向的内容不可修改,在后面,指针本身是常量,不可修改

【jiangyongtao】:
我编译了一下,提示如下语句。
error C2664: 'delete' : cannot convert parameter 1 from 'const char *' to 'void *'
我觉得const char* ch声明了一个const char型的指针ch并指向了char[20]的空间。
delete[] ch将ch指向的内存收回,那么指针ch将指向void而不是char了,而恰恰ch被声明为了const型,所以无法转换。
将const去掉就可以编译过,不知道能否证明我的说法。
欢迎大家指正。

【hongming1129】:
我需要的是一个指向const对象的指针,就内容不修改。而不是const指针。
delete [](char *)ch;编译通过,但出现运行时错误,程序崩溃,可以肯定还是此处delete错误。
jiangyongtao() 便宜时是error C2664: 'delete' : cannot convert parameter 1 from 'const char *' to 'void *'
而我的是rror C2665: 'delete' : none of the 2 overloads can convert parameter 1 from type 'const char *'
完全不同,这有些怪,搞不明白这为什么。
我用的编译器是VS6.0,到VS2005下面编译,通过,但运行时出现错误,程序崩溃,还是delete错误。

具体程序如下:

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main()
{
string str;
vector<string> svec;
while(//cin>>str
getline(cin,str))
{
if(str=="--end")
break;
svec.push_back(str);
}
int count=0;
for(vector<string>::size_type i=0;i!=svec.size();++i)
for(string::size_type j=0;j!=svec[i].size();++j)
++count;
char *cp=new char[count];
for(//vector<string>::size_type
i=0;i!=svec.size();++i)
{
for(string::size_type j=0;j!=svec[i].size();++j)
{
*cp=svec[i][j];
cout<<*cp;
++cp;
}
cout<<endl;
}
cout<<endl;
cp-=count;
delete [] cp;
const int N=50;
for(//vector<string>::size_type
i=0;i!=svec.size();++i)
{
const char *ch=new char[N];
ch=svec[i].c_str();
char *chp=new char[20];
sprintf(chp,"%x ",&ch);//atoi(chp);
strcat(chp,ch);
cout<<chp<<endl;
delete [] chp;
delete [] ch;
}

return 0;
}

【mymtom】:
const char *ch=new char[N];
...
ch=svec[i].c_str(); // 内存泄漏
...
delete [] ch; // 这时 ch 还是 svec[i].c_str(), 怎么可以delete 呢 ?

【yongmingcheng】:
VS2005里 可以

【hongming1129】:
谢谢mymtom()提醒,原来是ch已经指向另一个地址了,而非用new分配的那个。造成泄漏。
改为:
char *ch=new char[N];
strcpy(ch,svec[i].c_str());
就OK啦。
谢谢各位热心的朋友,散分。
netkinghancong
2010-06-16 · TA获得超过1592个赞
知道小有建树答主
回答量:823
采纳率:100%
帮助的人:502万
展开全部
delete[] a
overloads 无法完成这个操作符的重载。。。说明你这个语句有歧义。
delete[] a删除的是一个new出来的一个对象数组,而不是单个对象
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式