【发布时间】:2014-09-02 06:59:36
【问题描述】:
当 alloca 无法在堆上分配内存时,它会创建结构化异常 stackoverflow 并使用 Stackoverflow 停止程序。好的。但是当 _malloca 不能在堆上分配内存时,它什么也没说。我分配了大量内存,然后使用它,但得到访问冲突异常。 示例
#include <stdio.h>
#include <malloc.h>
#include <conio.h>
void foo(size_t n) {
int *arr = (int*) _malloca(n*sizeof(int));
size_t i;
for (i = 0; i < n; i++) {
arr[i] = rand();
}
for (i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
_freea(arr);
}
void main() {
foo(900000000000);
_getch();
}
但是当我只使用部分分配的内存时,我根本没有例外。示例
#include <stdio.h>
#include <malloc.h>
#include <conio.h>
void foo(size_t n) {
int *arr = (int*) _malloca(n*sizeof(int));
size_t i;
for (i = 0; i < 100; i++) {
arr[i] = rand();
}
for (i = 0; i < 100; i++) {
printf("%d ", arr[i]);
}
printf("\n");
_freea(arr);
}
void main() {
foo(900000000000);
_getch();
}
VSE2013 WinDesktop。 Oki,你可能会说,试着捕捉异常
#include <stdio.h>
#include <malloc.h>
#include <conio.h>
#include <windows.h>
void foo(size_t n) {
int *arr = NULL;
size_t i;
__try {
arr = (int*)_malloca(n*sizeof(int));
} __except (GetExceptionCode() == STATUS_STACK_OVERFLOW) {
int errcode;
printf("_malloca failed!\n");
_getch();
errcode = _resetstkoflw();
if (errcode) {
printf("Could not reset the stack!");
_getch();
_exit(1);
}
}
for (i = 0; i < 100; i++) {
arr[i] = rand();
}
for (i = 0; i < 100; i++) {
printf("%d ", arr[i]);
}
printf("\n");
_freea(arr);
}
void main() {
foo(900000000000);
_getch();
}
但它继续工作。如果使用数组的所有元素,则再次获得访问冲突。
问题:这是错误还是功能?
【问题讨论】:
-
@JoachimPileborg 来自同一手册页:“如果请求超过一定的字节大小,_malloca 会从程序堆栈或堆分配大小字节”(我只是强调擦它;-))
-
@PeterSchneider Ah 错过了这一点。考虑我适当地擦。 :)
-
@JoachimPileborg 奇怪的功能。需要用 _freea() 括起来(有点合乎逻辑)。因此,对于大小分配和本地范围不可预测的情况,这只是性能问题。
-
好的,我知道这很奇怪。我什至明白 MS 很奇怪,但是......如果不能在堆上分配内存,为什么它不返回 NULL?为什么它不触发异常呢?不是php,是c。也许还有其他地方我可以检查是否发生了错误?
-
根据the reference page,它应该在空间不足时抛出结构化异常,而不是返回
NULL。但是,为什么它不这样做我不知道。除非您使用的是某种具有超过 3 TB 内存的超级计算机? :)
标签: c stack-overflow alloca