2

Is it possible to mimic the behavior of dynamic allocation using the following code. For example we do not know the exact number of the integer that are stored in a file and we are going to read the file and then store it in an array called Hello.

int x;
int n=0;
ifstream input("a.dat");
while (!input.eof())
{
    input >> x;
    n++;
}
input.close();

int Hello[n];
cout << "n= " << n << endl;

int i=0;
while (!input.eof())
{
    input >> Hello[i];
    i++;
}
4

4 回答 4

2

是否可以使用以下代码模拟动态分配的行为。

不,主要区别在于程序中的数组存储在堆栈上,而所有动态内存分配都发生在堆上。

你到底在做什么,在你的代码中使用 C++ 中 C 的 C99 标准的 VLA 特性。在 g++ 编译器中使用 -pedantic 选项进行编译将揭示这一点。由于 C++ 不直接支持它,并且它是特定于实现的语言扩展,因此如果您的目标是编写可移植代码,那么使用它并不是一个好主意。

VLA 的使用alloca() ,在运行时在堆栈上分配内存,这里讨论了这种技术的缺点。

另外,VLA在运行时会在栈上分配内存,如果值超出范围,程序就会崩溃,而使用VLA快速创建几个字节的数组是可以的,创建不确定数量的大内存可能不安全,最好使用动态内存分配来处理它。

于 2013-04-28T04:45:57.230 回答
1
int Hello[n];

is NOT dynamic allocation. It is required that n is a compile time constant if you want to declare Hello in this way.

try:

int* Hello = new int[n];

and don't forget to release the memory when you are done using it:

delete[] Hello;
于 2013-04-28T04:09:34.453 回答
1

某些编译器允许这作为扩展,但严格来说不是 C++ 的一部分。

int Hello[n];

作为替代方案,您可以自己分配内存:

int* Hello = new int[n];

并自己释放它:

delete[] Hello;

std::vector但是您可以通过使用from来避免手动内存管理<vector>。它的构造函数之一接受初始大小:

vector<int> Hello(n);  // Vector with n elements, all initially 0.

您还可以在不调整大小的情况下设置初始容量,以进行一次分配:

vector<int> Hello;  // Empty vector.
Hello.reserve(n);   // Allocate space for n elements; size() is still 0.

然后读入一个int并使用push_back来插入值:

int value;
while (input >> value)
    Hello.push_back(value);

注意input >> valueas 循环条件的使用——只要读取成功,它就会读取。eof()仅当最后一次读取操作由于文件意外结束而失败时才返回 true,这不太可能正是您想要的。

于 2013-04-28T04:20:56.913 回答
0

首先是第二个

while (!input.eof())

总会失败。这终止了第一个,然后您开始关闭该输入流!

于 2013-04-28T05:19:37.247 回答