2012-09-02 60 views
0

下面是代碼:一塊C++代碼得到「無效的指針」錯誤

#include <iostream> 
#include <string> 
#include <vector> 
using namespace std; 
int main() 
{ 
    int *p = new int[2]; 
    p[0] = 1; 
    p[1] = 2; 
    cout << *p++ << endl; 
    delete p; 
    return 0; 
} 

它可以被編譯,但得到了一個運行時錯誤「免費():無效的指針」,然後是存儲器映射。

操作系統Ubuntu的10.10
編譯:G ++ 4.4.3

回答

6

你需要調用的delete陣列版本:

delete[] p; 

編輯:但是,你真正的問題是,你'正在遞增p
delete運算符只處理分配的原始指針。

+0

你有沒有試過? – nzomkxia

+0

否;我從來沒有寫過C++。 – SLaks

+0

一面注意,如果你做任何嚴肅的編碼也設置p = NULL是非常重要的;刪除之後 – pyCthon

3

您撥打delete的電話必須使用您撥打new時返回的相同指針。

在您的代碼中,您將p增加爲*p++,這歸因於運算符優先級被解釋爲*(p++)。由於這個原因,您正在提供delete內存管理器從未聽說過的指針。

此外,您應該使用delete[]來匹配new[]的呼叫。

話雖這麼說,這裏是你的目的可能是一個猜測:

int *p = new int[2]; 
p[0] = 1; 
p[1] = 2; 
for(int i = 0; i < 2; i++) 
    cout << p[i] << endl; 
delete[] p; 
return 0; 
1

看一個代碼:

int *p1 = new int; 
int *p2 = new int[2]; 

int *p3 = p1; 
int *p1 = p2; 

delete p3; 
delete[] p1; 

指針p1p2具有相同的表示和同組允許的操作。對於編譯器,它們都是int*

雖然它們指向的對象有很大不同。位於負數偏移處的new int[2]的對象具有包含數組中項目數的標題。

使用數組對象與標量對象相同。只有當這個對象被釋放時,有必要告訴編譯器它是什麼類型的對象。一個簡單的對象或數組。這是錯誤和困惑的已知來源。 Neverthless這種語言在數十年前就是這樣定義的,我們不能改變這一點。

deletenew返回的指針完全相同也很重要。此規則適用於簡單的newnew[]