【问题标题】:C++ Dynamic Memory ErrorC++ 动态内存错误
【发布时间】:2015-12-13 13:23:56
【问题描述】:

这是我的代码

int main()
{
    char *something = new char[10];
    something = "test";

    cout << something;

    delete[] something;
    return 0;
}

当我调试它时,它会打开应用程序并给我一个错误窗口,提示 Debug Assertion Failed: _CrtlsValidHeapPointer(block)

谢谢。

【问题讨论】:

  • something = "test" 这不是*将"test"复制到something,而是*让测试指向字符串常量"test"的地址。您只需重新分配指针。 delete[] 尝试释放静态字符串。启用警告,因为它应该触发一个!
  • 某事="测试"; -- 这将使某些指针指向字符串常量。失去了某些东西的原始价值。然后,当您删除某些内容时,您不会删除分配的 char[10] 而是尝试删除字符串常量并且出现问题...

标签: c++ heap-memory dynamic-memory-allocation


【解决方案1】:

在这种情况下,something 是一个指向字符的指针。在第二行中,您将something 的值更改为指向“test”的第一个字符,而不是您所期望的,即将“test”放置在something 指向的内存中。

当您delete 时,您正试图删除“测试”所在的内存,它是只读内存。

一般来说,您应该考虑将std::stringC++ 一起使用。如果您出于其他原因使用char *,请查看strcpystrncpy

【讨论】:

    【解决方案2】:
    something = "test";
    

    将您的指针分配给使用静态存储分配文字分配的地址。动态分配的原始指针会丢失。

    要复制内容,请使用std::copy()

    【讨论】:

      【解决方案3】:

      您需要使用 strcpy 将“test”复制到您的数组中。

      strcpy(something, "test"); // or even better user strncpy
      

      相反,您有:

      something = "test";
      

      关于用新地址覆盖存储在 something 变量中的指针的代码。编译器生成的字符串常量的地址。然后 delete [] 作用于这个新地址,它并不指向 new 返回的动态分配的内存。

      【讨论】:

        猜你喜欢
        • 2021-11-28
        • 2018-04-20
        • 1970-01-01
        • 2013-09-30
        • 2011-10-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多