数组声明vs指针+新

时间:2017-05-02 19:52:32

标签: gcc g++

我不太确定为什么会这样。我有一个程序:

std::ifstream file(path, std::ios::binary);
file.seekg(0, file.end);
int length = file.tellg();
file.seekg(0, file.beg);
char* buffer = new char[length];
file.read(buffer, length);
file.close();

运行良好,并正确读取数据。但是,如果我将buffer的声明替换为:

char buffer[length];

然后我得到了一个分段错误。数据大小约为几兆字节。有什么区别?

1 个答案:

答案 0 :(得分:1)

不同之处在于“几兆字节”太大而无法放入流程的“堆栈”,您现在正在放置数据。

(此外,您依赖于GCC扩展; length,作为一个变量,其值在运行时之前是未知的,不能合法地用作“普通”数组的大小,如此)

将代码恢复原样,并在完成使用后忘记delete[] buffer

实际上,这会更好:

std::vector<char> buffer(length);
file.read(&buffer[0], length);