当我尝试将第一个数组的内容复制到DMA中时,我的复制功能出现了超出范围的错误。需要try-catch块。
#include <iostream>
#include <cstdlib>
using namespace std;
void show( const int a[], unsigned elements );
int * copy( const int a[], unsigned els );
void die(const string & msg);
int main()
{
int arr[4] = {4, 2, 3, 6};
show(arr, 4);
int * newArr = copy(arr, 4);
}
void show( const int a[], unsigned elements )
{
for (int i = 0; i < elements; i++)
cout << a[i] << endl;
}
int * copy( const int a[], unsigned els )
{
try
{
int * newArr = new int[els];
}
catch(const bad_alloc &)
{
die("Alloc Failure");
}
for (int i = 0; i < els; i++)
newArr[i] = a[i];
return newArr;
}
void die(const string & msg)
{
cerr << "Fatal error: " << msg << endl;
exit(EXIT_FAILURE);
}
答案 0 :(得分:2)
如果您在try
块中声明变量,那么它只能在那里访问。您可以通过在块外移动声明来解决此问题。
int *newArr;
try
{
newArr = new int[els];
}
catch(const bad_alloc &)
{
die("Alloc Failure");
}
for (int i = 0; i < els; i++)
newArr[i] = a[i];
或者将其余代码移到try
。
try
{
int *newArr = new int[els];
for (int i = 0; i < els; i++)
newArr[i] = a[i];
return newArr;
}
catch(const bad_alloc &)
{
die("Alloc Failure");
}
答案 1 :(得分:2)
在try之前定义新数组,否则它只在try块内定义。
答案 2 :(得分:2)
例外的全部意义在于,你不需要在发生错误的时候处理所有可能的错误,而是在你选择的地方,你能够有意义地回应它们。所以要慷慨大小try
块:
int * copy(const int a[], unsigned els)
{
try
{
int * newArr = new int[els];
for (int i = 0; i < els; i++)
newArr[i] = a[i];
return newArr;
}
catch (const std::bad_alloc &)
{
die("Alloc Failure");
}
}
答案 3 :(得分:1)
您可以将代码更改为
int * copy( const int a[], unsigned els ) {
int * newArr = nullptr;
try {
newArr = new int[els];
}
catch(const bad_alloc &) {
die("Alloc Failure");
}
if(newArr) {
for (int i = 0; i < els; i++)
newArr[i] = a[i];
}
return newArr;
}
克服你的问题。只需正确初始化newArr
。
答案 4 :(得分:1)
我认为你的Copy-Function中的问题是,新的Array是一个局部变量。当您将其返回给调用者时,指针地址不是正确的。
您最好使用两个数组作为Referneces传递给复制函数,如下所示:
int& copy(int& newArray, const int& oldArray) { ... }
如果您不知道它们应该是什么,请在此处获得有关c ++中引用的描述:http://en.wikipedia.org/wiki/Reference_%28C%2B%2B%29