2009-07-10 73 views
0

所以,我有这个数组。它需要在此功能范围之外访问。我一直在把一个指向它的指针变成一对,这个指针变成了一个deque。但是一旦我超出范围,本地堆栈消失,数组无效,并且我刚刚得到一个无用的指针,对吧?范围,数组和堆

所以我试图把这个数组放到超范围的堆上,它会一直存在,直到我稍后再删除它。但我有问题得到这个工作。现在g ++正在咳嗽关于无效转换从'int'到'int *'的错误。

void randomFunction(int x, int y, int width, int height) 
{ 
    int **blah[4] = {x, y, width, height}; 
    std::pair <foobar*, int* > tempPair (foobar1, blah); 
    randomDeque.push_front(tempPair); 
} 

我也试过初始化这样的:

int *blah[4] = new int[4]; 

...它说,该阵列必须以括号内的初始化进行初始化。

我真的不习惯使用指针。我究竟做错了什么?

回答

1

整个概念对我来说很陌生。如果你在栈上声明数组,它不会超出函数的范围。如果你使用'新'分配它 - 确保你'删除'它,否则它是内存泄漏! 正确的代码,“新”是:

int *blah = new int[4]; 
... 
// don't forget to: 
delete [] blah; 
0

它看起来像你想有一个4x4的阵列,在这种情况下,你应该像这样创建它(未经测试的代码从我的头顶):

int **blah = new int* [4]; 
for(int i = 0; i < 4; ++i) 
{ 
    *blah[i] = new int[4]; 
} 

或者,你可以创建一维数组,并把它当作一个二维数组:

int *blah = new int[16]; 
#define ELEM(x,y) w*4+h 
blah[ELEM(1,1)] = 123; 
+0

您突出显示代码,然后按ctrl-k或*代码示例*按钮进行格式化。 – 2009-07-10 06:49:25

2

有两个问题。首先,确实,你都搞不清指针/数组:

int a[4]; // this is an array of 4 integers, a is the name of the array 
int *a[4]; // This is an array of 4 *pointers* to int 

所以你的宣言:

int **blah[4]; 

定义的4个指针数组的指针数组。也许你对以下事实感到困惑(我知道当我学习C时)。如果您声明一个变量:

int *a; 

这是一个指向整数的声明。但是,如果你有一个变量是一个指针,你用得到它指向(此处整数)的东西* A:

*a = 1; // a is a pointer (i.e. an address), *a is the value pointed to by a. 

所以*在声明来声明指针,但*陈述用于推定价值。

但是你的第二个问题与指针本身无关。这是关于资源管理(内存是一个,但文件,锁是其他)。超出范围时,堆栈上分配的任何东西不再存在。在纯粹的C语言中,你只有一个解决方案:在malloc上分配堆,然后确保释放。所以,你会做这样的事情:

​​

然后,你将与其他功能清洁:

foo *a; 
a = init_foo(); 
// do stuff 
clean_foo(a); 

例:FILE *手柄的fopen/FCLOSE(除分配的东西,有是一些与操作系统相关的东西来处理文件)。另一种解决方案是使用alloca,它不是标准的C,但是被许多工具链支持。

在C++中,您可以使用智能指针,例如使用引用计数来执行资源管理。我对C++不太熟悉,我相信人们会参与这一部分。引用计数的思想是它仍然具有自动指针的一些优点(您不必自己调用delete,这对于非平凡的项目来说极其容易出错),但不是纯粹基于范围的。一个引用基于计数的智能指针是boost中的shared_ptr。

1

我不知道我是否正确地做了你想做的事情,但是如果你想要返回一个int数组的引用,这将在randomFunction返回后有效,一个好方法是使用Boost:

#include <boost/shared_ptr.hpp> 
#include <vector> 

boost::shared_ptr<std::vector<int> > randomFunction(int x, int y, int width, int height) 
{ 
    boost::shared_ptr<std::vector<int> > blahPtr(new std::vector<int>(4)); 
    (*blahPtr)[0] = x; 
    (*blahPtr)[1] = y; 
    (*blahPtr)[2] = width; 
    (*blahPtr)[3] = height; 
    return blahPtr; 
} 

你不必记住delete荷兰国际集团blahPtr - 当所有副本走出去的范围,加速将自动删除您的std::vector对象和C++标准库将删除底层数组。