标题:[求助]老是说xalloc没声明
只看楼主
wangxiang
Rank: 2
等 级:新手上路
威 望:5
帖 子:376
专家分:0
注 册:2006-3-28
 问题点数:0 回复次数:10 
[求助]老是说xalloc没声明

#include <iostream>
#include <cerrno>
using namespace std;
template<class T>
void ChangeSize1D(T *&x,int size,int Tosize)
{
T * NewX =new T[Tosize];
for(int i = 0;i < size; ++i)
NewX[i] = x[i];
delete []x;
x = NewX;
}
int main()
{
float *x;
try{x = new float[3];}
catch(xalloc){
cerr<<"Out of Memory"<<endl;
exit(1);
}
try{ChangeSize1D(x,3,5);}
catch(xalloc)
{
cerr<<"Could bot create x"<<endl;
exit(1);
}
x[4] = 4;
cout<<x[4]<<endl;
delete []x;
system("pause");
return 0;
}
d:\c++练习\cpp1.cpp(17) : error C2061: syntax error : identifier 'xalloc'

搜索更多相关主题的帖子: xalloc 声明 catch int include 
2006-10-07 18:17
wangxiang
Rank: 2
等 级:新手上路
威 望:5
帖 子:376
专家分:0
注 册:2006-3-28
得分:0 

费了不少时间才知道xalloc只在BCB里用


2006-10-07 21:21
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
得分:0 
建议你使用dev IDE, 从本质上来讲就是建议你使用gcc 编译器, 就是建议你书写符合 c++ 标准的程序。

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2006-10-08 02:28
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
得分:0 
try catch 不是万能药。

书写一个函数, 应该考虑一个问题, 那就是安全性, 安全性包括对函数入口的安全检验, 函数体代码的安全处理, 函数出口的安全保证。

你的那个程序 ChangeSize1D(...); 有严重的安全漏洞, 第一 x 作为一个地址, 应该在入口处应该有个是否为 null 的检验, 如果为 null, 那么程序入口就出问题了, 可以马上返回一个 false 的 boolean 值, 还有在程序的入口处, 还应该对 size, Tosize 做是否大于零的检验. 在函数体内, 你也犯了不该犯的逻辑失误, 那就是在你的 for loop 中, 你考虑一下, 如果新开辟的空间大小比原来的小的话, 会发生什么事情. 还有, 你看一下 delete []x; 你要删除一段空间, 但是这里有个前提, 这个空间必须是动态开辟的, 这里你凭什么来确保这一点呢?

就这么一小段代码, 看似可以完成某个功能, 但是隐患是很大的. 如果一个比较大的项目的代码都是到处隐患代码, 那么肯定要出问题的.

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2006-10-08 02:50
wangxiang
Rank: 2
等 级:新手上路
威 望:5
帖 子:376
专家分:0
注 册:2006-3-28
得分:0 

谢谢,帮我指出那么多的错误!
确实没考虑到安全性,我再去改改


2006-10-08 09:32
wangxiang
Rank: 2
等 级:新手上路
威 望:5
帖 子:376
专家分:0
注 册:2006-3-28
得分:0 
修改了一下,有个问题:不知道该如何判断x这个空间是不是动态开辟的
#include <iostream>
#include <cerrno>
#include <new>
using namespace std;
template<class T>
bool ChangeSize1D(T *&x,int size,int Tosize)
{
if(0 == size)
return false;
T * NewX =new T[Tosize];
if(x == NULL)
return true;
int n = (size < Tosize)? size : Tosize;
for(int i = 0;i < n; ++i)
NewX[i] = x[i];
delete []x; //kai,我这里该如何判断x是不是动态开辟的呢
x = NewX;
return true;
}
int main()
{
float *x;
try{x = new float[3];}
catch(bad_alloc){
cerr<<"Out of Memory"<<endl;
exit(1);
}
try{if(ChangeSize1D(x,3,5))
cout<<"x was create!"<<endl;
}
catch(bad_alloc)
{
cerr<<"Could not create x"<<endl;
exit(1);
}
x[4] = 4;
cout<<x[4]<<endl;
delete []x;
system("pause");
return 0;
}

2006-10-08 09:52
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
得分:0 

似乎不用判断了。

T *&x。数组是不能通过编译的。


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-10-08 14:31
wangxiang
Rank: 2
等 级:新手上路
威 望:5
帖 子:376
专家分:0
注 册:2006-3-28
得分:0 

是的
数组不能通过编译


2006-10-08 21:47
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
得分:0 
#include <iostream>
#include <cerrno>
#include <new>
using namespace std;
template<class T>
T * changeSize1D(T * x, int size, int increase)
{
if(x>0 && size>0)
{
int newSize = size + increase;
if(newSize>0)
{
T * temp = NULL;
try
{
temp = new T[newSize];
}
catch(bad_alloc & ba)
{
cout<<"Caught exception"<<endl;
cout<<ba.what()<<endl;
return NULL;
}
if(newSize>=size)
memcpy(temp, x, size*sizeof(T));
else
memcpy(temp, x, newSize*sizeof(T));
return temp;
}
return NULL;
}
return NULL;
}
int main()
{
float * x;
try
{
x = new float[3];
x[0] = 0;
x[1] = 1;
x[2] = 2;
}
catch(bad_alloc & ba)
{
cout<<"Caught the exception!\n";
cout<<ba.what()<<endl;
exit(EXIT_FAILURE);
}
float * fp = changeSize1D(x, 3, -1);

if(fp)
{
cout<<"space was reallocated!"<<endl;
cout<<"new address:"<<fp<<endl;
cout<<"old address:"<<x<<endl;
cout<<fp[0]<<endl;
cout<<fp[1]<<endl;
cout<<fp[2]<<endl;
cout<<x[0]<<endl;
cout<<x[1]<<endl;
cout<<x[2]<<endl;
delete []fp;
}
else
cout<<"fp is null pointer\n";
delete []x;
system("pause");
return 0;
}

[此贴子已经被作者于2006-10-9 2:33:32编辑过]


自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2006-10-09 01:55
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
得分:0 
这个就是开辟空间失败的:
[CODE]#include <iostream>
#include <cerrno>
#include <new>
using namespace std;
template<class T>
T * changeSize1D(T * x, int size, int increase)
{
if(x>0 && size>0)
{
int newSize = size + increase;
if(newSize>0)
{
T * temp = NULL;
try
{
temp = new T[newSize];
}
catch(bad_alloc & ba)
{
cout<<"Caught exception"<<endl;
cout<<ba.what()<<endl;
return NULL;
}
if(newSize>=size)
memcpy(temp, x, size*sizeof(T));
else
memcpy(temp, x, newSize*sizeof(T));
return temp;
}
return NULL;
}
return NULL;
}
int main()
{
float * x;
try
{
x = new float[3];
x[0] = 0;
x[1] = 1;
x[2] = 2;
}
catch(bad_alloc & ba)
{
cout<<"Caught the exception!\n";
cout<<ba.what()<<endl;
exit(EXIT_FAILURE);
}
float * fp = changeSize1D(x, 3, 1000000000);

if(fp)
{
cout<<"space was reallocated!"<<endl;
cout<<"new address:"<<fp<<endl;
cout<<"old address:"<<x<<endl;
cout<<fp[0]<<endl;
cout<<fp[1]<<endl;
cout<<fp[2]<<endl;
cout<<x[0]<<endl;
cout<<x[1]<<endl;
cout<<x[2]<<endl;
delete []fp;
}
else
cout<<"fp is null pointer\n";
delete []x;
system("pause");
return 0;
}[/CODE]

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2006-10-09 02:35



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-94674-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012887 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved