我正在用C ++编写程序,出于某种原因,我在以下行中遇到了分段错误:
char* param= new char[200];
我尝试了不同的变化,甚至尝试过在它之前
int* param= new int;//for no reason
并发生相同的错误。我可以做些什么来解决这个问题?
什么可能导致像这样的简单内存分配给出问题。
我将包括该程序的其余部分,但它超过1000行。但随时可以要求更多信息。
答案 0 :(得分:8)
你做任何内存分配&在此之前解放?如果是这样,您可能以某种方式损坏了堆。没有看到更多代码就无法进一步诊断。
答案 1 :(得分:2)
我会说Neil在正确的轨道上 - 这可能是你之前被践踏的东西,只是被抓到了。
你确定:
[编辑] 在回复您关于拥有4GB内存的评论时,假设您的代码有效执行以下操作:
unsigned int amountToAllocate = 0;
amountToAllocate -= 1;
int* someStorage = new int[amountToAllocate];
someStorage[0] = 5;
...因为amountToAllocate
是unsigned int
,它会回绕到它的最大值(如果unsigned int
在您的硬件上为32位,则为4294967295)。所以你要尝试分配4294967295 * 4个字节(再次,假设int
s为32位)...这是~4 * 4GB并且会失败并且会导致令人讨厌的死亡。
答案 2 :(得分:2)
这是你可以使用它的方法,我用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;
}
答案 3 :(得分:1)
首先,验证此行是否存在问题。如果你发表评论会怎么样? (或将其替换为char *param = NULL
)
其次,这可能导致段错误的唯一方法是先前已经出错了。在此之前发生了什么?
如果您无法向我们展示相关的代码片段,那么这就是您的问题。开始评论一些代码或以其他方式隔离潜在的麻烦点。迟早,您将能够将问题归结为重现错误的小样本。那时,问题(和解决方案)可能是显而易见的,如果不是,至少你有一个合理大小的代码示例来向我们展示。
答案 4 :(得分:0)
我是@jalf说的第二个。你真的确定这是断裂的线吗?这不太可能。
当您尝试访问您无权访问的内存时,会发生seg故障。既然你没有要求任何特定的内存,而是让“新的”内存分配为你提供,那么问题必定在其他地方。
你应该做的是在你的代码中加入一堆打印语句。 (我假设你不习惯使用调试器?)这将让你看到程序在seg故障发生之前得到了多远。祝你好运!