【问题标题】:Unhandled Exception Error, Memory Violation未处理的异常错误,内存冲突
【发布时间】:2011-03-27 18:55:10
【问题描述】:

我的程序在创建新的 MyString 对象后立即崩溃。

当 stringArray[0] 在构造函数中设置为空字符时,我得到内存访问冲突。有什么想法吗?

这里是构造函数

MyString::MyString()
{
     stringSize = 0;
     stringCap = 16;
     stringArray[stringCap + 1];
     stringArray[0] = '\0';
}

这是类的私有成员

char* stringArray;
int stringCap;
int stringSize;

这是在 main.cpp 中创建对象的位置

MyString s1;

【问题讨论】:

    标签: c++ string class pointers


    【解决方案1】:

    此行不分配内存:

    stringArray[stringCap + 1];
    

    您需要将其替换为:

    stringArray = new char[stringCap + 1];
    

    别忘了删除记忆。

    这里也适用 3 规则,因为您拥有对象拥有的 RAW 内存。

    或者,如果您不想要动态分配,而是想要固定大小的字符串。然后您可以更改成员的声明:

    char stringArray[ <FixedSizeHere> ];
    

    【讨论】:

    • 确实如此。补充一下马丁所说的,类的析构函数是你应该释放分配的内存的地方:MyString::~MyString() { delete stringArray; }
    • @bluetickk 对我们所有人来说,重要的是您查看答案并接受解决您问题的答案,好吗?
    【解决方案2】:
    char* stringArray;
    

    上面的语句说,stringArray 是一个指向字符的指针。所以,它应该保存一个字符位置的地址。

    stringArray[stringCap + 1];
    

    在这里,您尝试访问位于索引stringCap+1 的字符,就好像stringArray 指向一个字符数组一样。但是stringArray 没有保存任何字符的地址位置。因此出现内存访问冲突的错误。

    如果你的意思是创建一个大小为stringCap+1 的数组,那也是错误的。

    stringArray[stringCap + 1];
              //^^^^^^^^^^^^^  size of the array should be compile time constant.
              // i.e., integer literal, or a #defined constant or const int
    

    看来,程序正在尝试创建大小为 17 的字符数组。所以,你可以在类声明中做到这一点 -

    class MyString
    {
         stringArray[17] ;
         // .....
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-31
      • 1970-01-01
      • 1970-01-01
      • 2018-11-16
      • 1970-01-01
      • 2020-10-24
      • 2011-04-12
      • 1970-01-01
      相关资源
      最近更新 更多