有什么问题:char*param=new char[200]; 我在C++编写一个程序,由于某种原因,我在下面的行中得到了一个分段错误: char* param= new char[200];

有什么问题:char*param=new char[200]; 我在C++编写一个程序,由于某种原因,我在下面的行中得到了一个分段错误: char* param= new char[200];,c++,new-operator,C++,New Operator,我试过不同的变奏,甚至试过把它放在前面 int* param= new int;//for no reason 同样的错误也会发生。我可能做了什么导致这个问题 什么可能会导致像这样的简单内存分配出现问题 我会包括程序的其余部分,但超过1000行。但请随时询问更多信息。在此之前您是否进行过内存分配和释放?如果是这样,您可能已经以某种方式损坏了堆。如果看不到更多的代码,就无法进行进一步诊断。我认为尼尔的做法是正确的——很可能是你之前踩过的东西,只是在那里被抓住了 您是否确保: 以前的所有分配都成功

我试过不同的变奏,甚至试过把它放在前面

int* param= new int;//for no reason
同样的错误也会发生。我可能做了什么导致这个问题

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


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

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

我认为尼尔的做法是正确的——很可能是你之前踩过的东西,只是在那里被抓住了

您是否确保:

  • 以前的所有分配都成功
  • 您还没有写过任何数组的结束或开始(有)
  • [编辑]针对您关于拥有4GB RAM的评论,假设您的代码有效地执行了以下操作:

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

    …因为
    amountToAllocate
    是一个
    无符号整数
    ,它将环绕到它的最大值(如果
    无符号整数
    在硬件上为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;
    }
    
    #包括
    使用名称空间std;
    int main()
    {
    int*param=新的int[200];
    对于(int i=0;i<200;++i)参数[i]=i;
    
    对于(int i=0;i<200;++i)cout首先,验证此行是否存在问题。如果将其注释掉会发生什么情况?(或将其替换为
    char*param=NULL

    第二,这可能导致segfault的唯一方法是,如果之前已经出现了问题。在此之前会发生什么


    如果您不能向我们展示相关的代码片段,那么这就是您的问题。请开始注释代码片段或以其他方式隔离潜在的故障点。迟早,您将能够将问题归结为一个小样本,从而再现错误。此时,问题(和解决方案)已经解决可能是显而易见的,如果不是,至少你有一个合理大小的代码样本给我们看。

    我同意@jalf的说法。你真的确定这是seg断层吗?这不太可能

    当您试图访问您无权访问的内存时,会发生seg故障。因为您没有要求任何特定内存,而是让“新”内存分配为您分配,所以问题一定在别处


    您真正应该做的是在代码中放入一堆print语句(我假设您不习惯使用调试器)这将让您看到程序在seg故障发生之前能走多远。祝您好运!

    您需要包含某种代码,因为这些代码行本来就很好。可能会在仍然复制错误的情况下将程序缩减到尽可能小的程度。什么样的错误,以及您在尝试访问这些值时会遇到什么样的错误?H你们是如何访问它们的?若你们愿意让整个互联网都能看到你们的代码,你们可以随时把它发布到过去的邮箱[是的,特别是如果之前有一个数组分配,它是由标量删除而不是数组删除释放的。有一些工具可以帮助诊断这个问题--electricfence、dlmalloc、valgrind(很重,但很神奇),Windows上的HeapValidate调用,Windows上的应用程序验证程序,等等…我想我会试试你提到的一个程序。我会让你知道它是如何运行的。你能推荐一个好的程序来检查Windows的内存问题等。对初学者来说很容易使用。一些已经为Windows编译过的程序-我刚刚下载了Duma bu如果没有代码块项目文件,我不知道如何使用代码块编译项目……这是一个很好的例子,尽管我认为问题存在于其他地方,因此在查找OPs问题的根源方面并不一定有帮助。你是对的,但由于他没有向我们展示任何代码,他可以使用该示例将使用情况与他所做的进行比较如果你不习惯使用调试器,你应该做的是习惯使用调试器;)lol-我在使用调试器(内置代码块)它一直工作到那一行,然后出现seg错误。可能调试器的某些功能我不熟悉,但我肯定会使用它!为什么以前的分配没有成功?我有4gb Ram!?但说真的,我需要像C一样检查成功吗?是的,如果你你将依赖于以后访问这些。另一个答案是——不,不值得。当虚拟机变得普遍时(15年前),我放弃了检查内存分配由于分配失败,我从未遇到过一个问题。我可能应该指出,我主要工作的嵌入式软件运行在受严格限制的处理卡上,这让我产生了偏执症;-)…也就是说,我上面提出的问题仍然是个问题,因为代码可能不打算尝试分配所有的记忆。