C++中的new与delete使用时出错退出

#include <iostream>
using namespace std ;
int main( )
{
//new的用法
int *a = new int( 4 ) ;
cout << *a << endl ;
system ( "pause" );
system ( "cls" ) ;
int *b = new int[ *a ] ; //在这里无法赋值
for ( int i = 1 ; i <= *a ; i++ )
{
b[ i ] = i ;
}
cout << b[ 1 ] << b[ *a ] << b[ 2 ] << endl ;
system ( "pause" ) ;
//!!!!!!!!!!
delete b ;
delete a ;
system ( "pause" ) ;
return 0 ;
}
————————————————————————————————
该程序运行时出错至“!!!!!!!!!!!!”时直接关闭,求原因和解决方法
(Windows7系统,32位,dev-c++4.9.9.2)

第1个回答  2013-08-17
int *a = new int( 4 ) ; 改为 int *a = new int[4];

cout << *a << endl ;这里会输出a[0],由于你没赋值,所以是个随机值。

int *b = new int[ *a ] ; 我去,你这是要干嘛???*a如果是999999999999,你给b开这么大的空间干什么???

b[ i ] = i ; 这个循环要从0开始到*a-1,而不是1到*a,注意下标,数组赋值越界了。

后面输出最大也是b[*a-1]。
ok?
第2个回答  2013-08-16
大神啊,C++/C语言中,标号是从0开始的,不是从1,你的代码就错在越界啊,应该改为
for ( int i = 1 ; i <= *a ; i++ )
{
b[ i -1] = i ;
}
cout << b[ 1 ] << b[ *a -1] << b[ 2 ] << endl ;
system ( "pause" ) ;

还有应该 delete[] b ;追问

更改后的
————
system ( "pause" ) ;
delete[ ] b ;
system ( "pause" ) ;
delete a ;
system ( "pause" ) ;
return 0 ;
}
————
  编译后运行到“delete[ ] b ;”时直接退出或停止工作,求原因和解决方法

追答

什麽编译器?我用vc6.0和Dev-C++编译运行都是好的啊?
#include
using namespace std ;
int main( )
{
//new的用法
int *a = new int( 4 ) ;
cout << *a << endl ;
system ( "pause" );
system ( "cls" ) ;
int *b = new int[ *a ] ; //在这里无法赋值
for ( int i = 1 ; i <= *a ; i++ )
{
b[ i -1] = i ;
}
cout << b[ 1 ] << b[ *a -1] << b[ 2 ] << endl ;
system ( "pause" ) ;
//!!!!!!!!!!
delete[] b ;
system ( "pause" ) ;
delete a ;
system ( "pause" ) ;
return 0 ;
}

追问

编译多次,每次都不一样。但是无论如何,都会在“delete[ ] b ;”的地方退出或显示“XXX.exe无响应”
有时连“cout……”后面的“system ( "pause" ) ;”都没有

追答

你确定改后的代码跟我上面的一样?
我用dev-c++4.9.8.0编译运行没有任何异常啊!

如果可以建议加q~

本回答被提问者采纳

为何一段简单的C++代码在运行时退出的时候出现异常
p = new int(size);这里写错了,要用【】不要用()用括号的意思是初始化一个并且赋值为括号里面的数 用中括号才是new一个数组。

C++ delete[]运行时错误 输出:其原因可能是堆被损坏,这也说明程序或它...
1. 这样就导致lpszZipArchive 和lpszSrcFile 变成了野指针了。2. 后面两个赋值语句,将两个指针指向了栈内存。而栈内存是由系统分配和释放的。你直接调用delete去删除,就会出错。举个简单的例子:char szBuf[80] = {0};char *p = new char[80];p = szBuf;delete[] p;你看看我给的例子...

C++中,在一段正常的代码中,只要加入delete指针,程序就崩溃。怎么回事...
delete只能释放new(new开辟出来的地址在内存中一个叫堆内存的区域里面)出来的地址,你的varOne不是new出来的,你的varOne对应的内存在内存中一个叫栈的地方,栈上的内存是不允许被delete释放的,因为栈上的内存一般都在函数中(这里的函数是main),当函数执行结束之后栈上的内存会自动释放。所以你的de...

C++使用delete函数,程序总是出错
j<m;j++)delete []mark[i];delete [] mark;return 0;}这样就可以了哈~,

C++在delete时出错了,不知道是什么原因
delete [] data;data = new char[m + 1];memset(data,0,m+1);strncpy(data,c1,m );} void String::Output1(int begin){ for(int i=0;i<begin;i++){ cout<<*(data + i);\/\/data++;} cout<<endl;\/\/data=data-begin;} void String::Output2(int begin){ cout<<data<<endl;...

C++中delete出错
include <iostream> using namespace std;int main(){ char *s=new char[5];\/\/char[6]char *p=s;p = p+5;p = '\\1';cout<<*p;delete []s;} \/\/是有错误的,只是编译器没有报错,注意运行两个不同的char[5]和char[6]时,出现的东西是有 \/\/错的,你访问的超过了所约定的界限,...

delete引发异常中断
这个应该不好弄吧,c++既然有new、delete,就是给了你堆的权限。如果怕资源管理不当的话,考虑一下用智能指针去管理资源。用对象管理资源的好处在 《c++ primer》和《effective c++》中都讨论的很多。与其等着出现异常后在处理,为什么不把异常直接扼杀掉.

c++,delete处为何中断
问题出现在这一句 p[strlen(str.c_str())] = 0;这个p应该改成t,就是 t[strlen(str.c_str())] = 0;因为p在循环中已经向后移动了 再这样做,会搞坏别的内存块 直接删掉这句也可以,strcpy时候,会把最后的\\0拷过来,这个多此一举 ...

c++中delete之后的再new问题
new int; 是给它分配存放指向数值的单元。delete 只删了 存放指向数值的单元。指针本身单元还在。只要它的使用符合语法,仍然可用。例如:a = 2;b=3;p = &a; printf("%d\\n",*p);p = &b; printf("%d\\n",*p);--- int *p=new int;p=1;delete p;p=2;不发生错误因为程序较小,指向...

C++ delete 类对象引用 不能正确运行
new和delete是成对出现的,没有new,就不要delete。new是申请内存空间给一个指针,申请后如果不delete,那部分内存就一直占着,直到重启机器。对于非指针变量,内存自动分配,用完后自动释放,不要你关心的。总之记住,一个new对应一个delete,就好比括号一样,没有对应的左括号,这个右括号不就是错误了...

相似回答