0

我正在用 C++ 编写一个程序,由于某种原因,我在以下行出现分段错误:

char* param= new char[200];

我尝试了不同的变体,甚至尝试在它之前放置

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

并发生同样的错误。我可能做了什么导致这个问题?

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

我会包括程序的其余部分,但它超过 1000 行。但请随时询问更多信息。

4

5 回答 5

8

在此之前您是否进行任何内存分配和释放?如果是这样,您可能以某种方式损坏了堆。如果不查看更多代码,就无法进一步诊断。

于 2009-05-13T14:40:08.353 回答
2

我会说尼尔走在了正确的轨道上——这可能是你之前踩过的东西,只是在那里被抓住了。

您是否确定:

  1. 之前的所有分配都成功了。
  2. 您没有写过任何数组的结尾或开头(那里有大量用于检查边界的信息和工具)。

[编辑]为了回应您关于拥有 4GB 内存的评论,假设您的代码有效地执行了以下操作:

unsigned int amountToAllocate = 0;
amountToAllocate -= 1;

int* someStorage = new int[amountToAllocate];

someStorage[0] = 5;

...因为amountToAllocateunsigned int,它将环绕到它的最大值(如果unsigned ints 在您的硬件上是 32 位,则为 4294967295)。因此,您将尝试分配 4294967295*4 字节(再次假设ints 对您来说是 32 位的)...大约为 4*4GB 并且会失败并死去。

于 2009-05-13T14:49:02.923 回答
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;
}
于 2009-05-13T14:49:14.173 回答
1

首先,确认这条线是问题所在。如果你把它注释掉会发生什么?(或替换为char *param = NULL

其次,这可能导致段错误的唯一方法是之前已经出现问题。在此之前会发生什么?

如果您不能向我们展示相关的代码片段,那就是您的问题。开始注释掉一些代码或以其他方式隔离潜在的故障点。迟早,您将能够将问题归结为重现错误的小样本。在这一点上,问题(和解决方案)可能很明显,如果不是,至少你有一个合理大小的代码示例来展示给我们。

于 2009-05-13T16:10:59.360 回答
0

我支持@jalf 所说的话。你真的确定这是段错误的线路吗?这是非常不可能的。

当您尝试访问您无权访问的内存时,会发生段错误。由于您没有要求任何特定的内存,而是让“新”内存分配为您获取它,所以问题一定出在其他地方。

你真正应该做的是在你的代码中加入一堆打印语句。(我假设你不习惯使用调试器?)这会让你看到程序在段错误发生之前能走多远。祝你好运!

于 2009-05-13T16:47:00.487 回答