2010-04-28 111 views
1

我正试图动态分配内存到堆中,然后删除分配的内存。当编译器尝试删除CharArrayC++初学者删除代码

// String.cpp 
#include "String.h" 

String::String() {} 

String::String(char* source) 
{ 
this->Size = this->GetSize(source); 
this->CharArray = new char[this->Size + 1]; 
int i = 0; 
for (; i < this->Size; i++) this->CharArray[i] = source[i]; 
    this->CharArray[i] = '\0'; 
} 

int String::GetSize(const char * source) 
{ 
int i = 0; 
     for (; source[i] != '\0'; i++); 
     return i; 
} 

String::~String() 
{ 
delete[] this->CharArray; 
} 

这是我得到的错误:下面是给了我一个很难的代码

0000005:访问冲突读取位置0xccccccc0。

这里是堆栈上的最后一次通话:

msvcr100d.dll的operator delete(void *的pUserData)线52 + 0x3字节C++

我相当肯定的这段代码中存在错误,但会向您提供所需的任何其他信息。哦,是的,使用VS 2010的XP。

编辑:我的继承人STRING.H

// String.h - string class 
#pragma once 

#define NOT_FOUND -1 

class String 
{ 
public: 
    String(); 
    String(char* source); 
    static int GetSize(const char * source); 
    int Find(const char* aChar, int startPosition = 0); 
    ~String(); 
private: 
    char* CharArray; 
    int Size; 
}; 
+1

完成默认构建时,“CharArray”的值是多少? – GManNickG 2010-04-28 00:31:38

+1

你可以发布你使用这个代码吗?我怀疑你可能有使用默认构造函数的代码,这会使CharArray未初始化。 – kibibu 2010-04-28 00:32:20

+1

为什么这个 - >会员当你只能说会员? – tiftik 2010-04-28 00:34:55

回答

5

更改您的默认ctor;考虑到你得到的错误,delete调用试图删除一个从未被初始化过的指针。

String::String() : Size(0), CharArray(NULL) {} 

另外,要小心“复制构造函数”。您可能希望将其隐藏起来,以确保您不会隐式触发它。 (如果你不打算调用它,只需将函数原型粘贴到你的类定义中就不需要实现。)同样可以“禁用”赋值运算符。

class String 
{ 
    // other stuff 

private: 
    String(String&); 
    String& operator=(String&); 
}; 

这除了满足“三法则”,它说,如果任何类需要析构函数,一个拷贝构造函数或赋值操作符,它可能需要三个。

编辑:看到http://en.wikipedia.org/wiki/Rule_of_three_%28C%2B%2B_programming%29

+0

感谢您的信息!我会尝试以上的建议,并会让你们知道它是否能解决我的问题。 – Pooch 2010-04-28 00:47:41

+0

关于在构造函数中初始化成员的集体建议解决了我的原始问题。然后我收到另一个错误,这是由于没有正确实现'='操作符。哈!猜测三者的规则是有原因的。再次感谢所有的帮助! – Pooch 2010-04-28 00:54:52

+0

大声笑,事实上,三条规则在我真正拥抱它之前向我解释了很多。 :) – 2010-04-28 01:39:59

0

我觉得@ DASH-TOM-爆炸是正确的。您可能正在复制String,然后删除其数据两次。不过,我会保留旧的答案供参考。

你将需要发布使用String的代码,但我可以在这里发现了一些问题:

  1. 如果source为NULL,在构造函数?立即你有一个空指针异常。更糟糕的是,如果你得到这个异常,析构函数将尝试删除从未分配过的内存。如果您使用try ... catch,这可能会导致上述错误。

  2. GetSize不应该是String的成员函数,因为它不使用任何成员变量。至少它应该是static

+0

'std :: string'不喜欢被传递NULL指针...... – 2010-04-28 00:40:11

+0

......也就是说,假设没有人传递给NULL指针,除非你说他们可以。另外,默认情况下,操作异常(如NULL访问)不会导致C++异常;他们立即终止。 – Potatoswatter 2010-04-28 00:43:10

2
String::String(): CharArray(0) {} 

你不是在每一个构造函数初始化CharArray,所以在某些情况下,你要删除未初始化的指针。

0

你有多个构造函数,但其​​中只有1调用新。你的析构函数总是调用delete,所以有你的错误。