簡體   English   中英

從數組中刪除指針

[英]Deleting pointers from an array

我對C ++很新,我遇到的這個問題讓我在過去的2個小時里難以接受。 我要做的是創建一個指向我的類Word對象的指針數組,所以是一個二維數組,它是**wordPtrList 然后我需要刪除數組中某些對象的內存並將其指針設置為null。 我寫了一個較小的版本,我想在下面完成。

int main()
{
    char *cArray;
    cArray = new char[4];
    int i;

    for (i = 0; i < 3; i++)
        cArray[i] = 'a';

    cArray[i + 1] = '\0';   //cArray is a null terminated string

    Word **wordPtrList;
    wordPtrList = new Word* [3];

    for (i = 0; i < 3; i++)
    {
        wordPtrList[i] = new Word(cArray);
    }

    wordPtrList[1]->del();
    delete wordPtrList[1];
    wordPtrList[1] = '\0';

    return 0;
}

class Word
{
private:
    char* ptr_;
    int len_;
public:
    Word(const char* word)
    {
        len_ = strlen(word);
        ptr_ = new char[len_];      
        strcpy(ptr_, word);
    }
    ~Word()
    {
        delete [] ptr_;
        ptr_ = 0;
    }


    void del()
    {
        delete [] ptr_;
        ptr_ = 0;
        return;
    }

};

但是,當我這樣做時,我得到:

調試錯誤堆損壞在正常塊后檢測到

這是在Windows 7上的VS 2010中。

所以我要問的是,如何刪除對象的內存,以便將wordPtrList[1]設置為Null?

看看這段代碼:

for (i = 0; i < 3; i++)
    cArray[i] = 'a';
cArray[i + 1] = '\0';   //cArray is a null terminated string

問題出在使用i+1作為索引的最后一行,它超出了范圍,就像循環退出時一樣, i的值已經是3 ; 這意味着當您分配cArray時, i+1將變為4 ,這不能成為有效索引:

cArray = new char[4]; //taken from your code

解決方案是這樣的:

cArray[i] = '\0';   //Now, it is correct. Here i is equal to 3

也就是說,使用i而不是i+1 ; 或者只是使用3


在C ++中,您可以使用std::fill而不是手動循環,如下所示:

std::fill(cArray, cArray + 4, 'a'); //done

更妙的是避免使用char*new盡可能多的,和喜歡使用std::string代替。

您正在為cArray分配4個字節(意味着您有權寫入字節0到3),然后寫入cArray [4]。 您還在Word構造函數中分配了一個太小的字節。

char *cArray;
cArray = new char[4];
int i;

for (i = 0; i < 3; i++)
    cArray[i] = 'a';
cArray[i] = '\0';   //cArray is a null terminated string - i is now 3

 Word(const char* word)
 {
    len_ = strlen(word);
    ptr_ = new char[len_ + 1];      
    strcpy(ptr_, word);
 }

應該做的伎倆。

代碼中有兩個明顯的逐個錯誤(當你離開第一個循環時,變量i的值是什么?當調用strlen時你是否還記得考慮空終止符所需的空間?)。

另請注意,c字符串不是“空終止”,它們是“NUL終止”,大寫字母只有一個“L”。 NUL是ASCII控制字符的名稱,所有位都設置為零,並在C ++中用'\\0' 在一個地方你使用NUL字符作為空指針,雖然這在技術上是正確的(因為C ++語言的設計錯誤),但最好理解這兩個概念是完全不同的。

正如其他人所說,你基本上是訪問一個超出數組范圍的數組索引。

我會選擇Nathan Wiebe的解決方案。

將來,當您可以選擇執行此操作時,建議使用std::vector<T>因為這樣可以在動態可調整大小的數組中存儲您希望的任何類型。 換句話說,假設您不訪問向量邊界之外的索引,您可以執行以下操作:

std::vector< char* > str;

for( size_t i = 0; i < str.size(); ++i )
{
   str.push_back( 'a pointer to a block of memory consisting of characters' ); 
}

class Word
{
public:
    Word( const char* str )
    {
        mStrs.push_back( str );
    }
    ~Word( void )
     {
         for( size_t i = 0; i < mStrs.size(); ++i )
         {
             if( mStrs[ i ] )
             {
                 delete mStrs[ i ];
                 mStrs[ i ] = NULL;
             }
         }

         mStrs.clear();
     }

private:
    void del( size_t index )
    {   
         if( index > mStrs.size() )
         {
              //error - throw new exception or something
         }

         delete mStrs[ index ];
    }

    std::vector< const char* > mStrs;

};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM