2010-04-28 84 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,所以有你的錯誤。