可能出错的地方:char * param = new char [200];

时间:2009-05-13 14:37:04

标签: c++ new-operator

我正在用C ++编写程序,出于某种原因,我在以下行中遇到了分段错误:

char* param= new char[200];

我尝试了不同的变化,甚至尝试过在它之前

int* param= new int;//for no reason

并发生相同的错误。我可以做些什么来解决这个问题?

什么可能导致像这样的简单内存分配给出问题。

我将包括该程序的其余部分,但它超过1000行。但随时可以要求更多信息。

5 个答案:

答案 0 :(得分:8)

你做任何内存分配&在此之前解放?如果是这样,您可能以某种方式损坏了堆。没有看到更多代码就无法进一步诊断。

答案 1 :(得分:2)

我会说Neil在正确的轨道上 - 这可能是你之前被践踏的东西,只是被抓到了。

你确定:

  1. 之前的所有分配均已成功。
  2. 你没有写过任何数组的结尾或开头(那里有a plethora of information and tools for bounds checking)。
  3. [编辑] 在回复您关于拥有4GB内存的评论时,假设您的代码有效执行以下操作:

    unsigned int amountToAllocate = 0;
    amountToAllocate -= 1;
    
    int* someStorage = new int[amountToAllocate];
    
    someStorage[0] = 5;
    

    ...因为amountToAllocateunsigned 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故障发生之前得到了多远。祝你好运!