c++ delete[]编译错误
发布网友
发布时间:2023-07-03 15:11
我来回答
共2个回答
热心网友
时间:2024-12-11 21:17
我找到一个此类问题的讨论贴,看你有没帮助吧
【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啦。
谢谢各位热心的朋友,散分。
热心网友
时间:2024-12-11 21:18
delete[] a
overloads 无法完成这个操作符的重载。。。说明你这个语句有歧义。
delete[] a删除的是一个new出来的一个对象数组,而不是单个对象