我正在用 C++ 编写一个程序,由于某种原因,我在以下行出现分段错误:
char* param= new char[200];
我尝试了不同的变体,甚至尝试在它之前放置
int* param= new int;//for no reason
并发生同样的错误。我可能做了什么导致这个问题?
什么可能导致像这样的简单内存分配产生问题。
我会包括程序的其余部分,但它超过 1000 行。但请随时询问更多信息。
我正在用 C++ 编写一个程序,由于某种原因,我在以下行出现分段错误:
char* param= new char[200];
我尝试了不同的变体,甚至尝试在它之前放置
int* param= new int;//for no reason
并发生同样的错误。我可能做了什么导致这个问题?
什么可能导致像这样的简单内存分配产生问题。
我会包括程序的其余部分,但它超过 1000 行。但请随时询问更多信息。
在此之前您是否进行任何内存分配和释放?如果是这样,您可能以某种方式损坏了堆。如果不查看更多代码,就无法进一步诊断。
我会说尼尔走在了正确的轨道上——这可能是你之前踩过的东西,只是在那里被抓住了。
您是否确定:
[编辑]为了回应您关于拥有 4GB 内存的评论,假设您的代码有效地执行了以下操作:
unsigned int amountToAllocate = 0;
amountToAllocate -= 1;
int* someStorage = new int[amountToAllocate];
someStorage[0] = 5;
...因为amountToAllocate
是unsigned int
,它将环绕到它的最大值(如果unsigned int
s 在您的硬件上是 32 位,则为 4294967295)。因此,您将尝试分配 4294967295*4 字节(再次假设int
s 对您来说是 32 位的)...大约为 4*4GB 并且会失败并死去。
这就是您可以使用它的方式,例如,我用 int 替换了 char 以存储一些值,但与 char 相同。
#include <iostream>
using namespace std;
int main()
{
int * param = new int[200];
for (int i = 0; i < 200; ++i) param[i] = i;
for (int i = 0; i < 200; ++i) cout << param[i] << endl;
delete[] param;
return 0;
}
首先,确认这条线是问题所在。如果你把它注释掉会发生什么?(或替换为char *param = NULL
)
其次,这可能导致段错误的唯一方法是之前已经出现问题。在此之前会发生什么?
如果您不能向我们展示相关的代码片段,那就是您的问题。开始注释掉一些代码或以其他方式隔离潜在的故障点。迟早,您将能够将问题归结为重现错误的小样本。在这一点上,问题(和解决方案)可能很明显,如果不是,至少你有一个合理大小的代码示例来展示给我们。
我支持@jalf 所说的话。你真的确定这是段错误的线路吗?这是非常不可能的。
当您尝试访问您无权访问的内存时,会发生段错误。由于您没有要求任何特定的内存,而是让“新”内存分配为您获取它,所以问题一定出在其他地方。
你真正应该做的是在你的代码中加入一堆打印语句。(我假设你不习惯使用调试器?)这会让你看到程序在段错误发生之前能走多远。祝你好运!