请问这个代码在VC6下运行就出错,在DEVCPP下就正常?谢谢
//头文件
#include "stdlib.h"
template <class T>
class CArray{
private:
T * m_arr;
int size;
public:
CArray(int s){
m_arr=new T(s); //根据参数构造数组
size=s;
}
~CArray(){
delete[] m_arr; //释放内存
}
T & operator [](int ind){ //重载下标运算符
if(size < ind){
cerr<<"out of size!"<<endl;
exit(1);
}
else
return m_arr[ind];
};
int getsize(){return size;}; //返回数组大小
};
//main.cpp
#include <iostream.h>
#include "Array.h"
int main(){
CArray<long> aa(3);
aa[1]=100;
aa[2]=200;
cout<<"size:"<<aa.getsize()<<endl;
for(int i=0;i<aa.getsize() ;i++){
cout<<aa[i]<<endl;
}
return 0;
}
谢谢
问题点数:20、回复次数:5Top
1 楼goodname(叶落知秋)回复于 2005-02-22 11:10:44 得分 8
m_arr=new T(s); //根据参数构造数组
这个地方好像不是new出来的数组吧?Top
2 楼blueskyzsz(青禾)回复于 2005-02-22 11:19:12 得分 6
楼上说得对,你不能保证传进来的模板参数能通过下面的操作new出数组来
m_arr=new T(s)
你实例化类模板的时候,其实传进来的类型是long
所以你的这句话就演绎成了
m_arr = new long(s);
size=s;
只是new了一个long变量,你保存的size也是错的Top
3 楼goodname(叶落知秋)回复于 2005-02-22 11:27:00 得分 6
vc调试的时候是因为,在debug模式下有个
#define new DEBUG_NEW
(好像是)
这一句把程序里面的new都改作了调试版本的了,
此时new出来的一段内存,前后都有调试字符填充,所以,
调试状态下,如果非法内存访问,就会出
断言失败,会跳出对话框来。
而dev-cpp则没有,而且c/c++又不检查数组是否越界。
你的程序只是new了一个实例,并且用s初始化,仅此而已。Top
4 楼yqzq(花心萝卜)回复于 2005-02-22 11:41:37 得分 0
唉!!大意了!大意了!
多谢各位!
散分Top
5 楼xboss(丑陋的代码)回复于 2005-02-23 16:25:19 得分 0
56eTop




