2011-03-27 44 views
0

一旦创建了新的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; 

回答

1

这行做不分配内存:

stringArray[stringCap + 1]; 

你需要替换它:

stringArray = new char[stringCap + 1]; 

不要忘记删除记忆。

此处的规则也适用于此处,因为您拥有对象拥有的RAW内存。

另外,如果你不想要动态分配,而是固定大小的字符串。然后你就可以改变你的会员的声明:

char stringArray[ <FixedSizeHere> ]; 
+0

确实。为了增加Martin的说法,类的析构函数是你应该释放分配内存的地方:'MyString ::〜MyString(){delete stringArray; }' – karlphillip 2011-03-27 19:02:59

+0

非常棒的帮助,非常感谢 – bluetickk 2011-03-27 19:04:35

+0

@bluetickk对于我们所有人来说,重温答案并接受解决问题的答案非常重要,好吗? – karlphillip 2011-03-27 19:10:34

0
char* stringArray; 

上述声明说,stringArray是一个指向字符(S)。所以,它应该保存一个角色位置的地址。

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 

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

class MyString 
{ 
    stringArray[17] ; 
    // ..... 
}; 
相关问题