2011-08-23 35 views
0

我有以下代碼:如何使用指針和引用C++和VALGRIND?

[test.h] 
class MyClass 
{ 
public: 
    string Name; 
    MyClass(); 
    void method(MyClass &obj); 
} 

[test.cpp] 
void MyClass::method(MyClass &obj) 
{ 
    cout<<obj.Name<<endl; 
} 

[main.cpp] 
#include "test.h" 

void main() 
{ 
    MyClass *class = new MyClass(); 
    class->Name="Foo"; 
    class->method(*class); 

    delete class; 
} 

我想問一下,如果這是爲具有包含對象的引用發送方法的正確方法。 我是否正確釋放分配的內存? 我這樣問,因爲對於一個類似的例子,當測試valgrind我有這樣的:有條件的跳轉或移動依賴單位化值。

我在Ubuntu下使用C++。我的編譯器是g ++。 APECECIATE !! 編輯!

爲什麼我不能把INT值VALUE = 0;在test.h文件中?

+0

似乎對我很好,但你應該在其c'tor中初始化班級的成員。 另外,如果你用-g標誌編譯,valgrind會告訴你它認爲有錯誤的行號:) –

+0

@Eran:沒有必要明確地初始化'Name'。 'std :: string'的默認構造函數隱式調用。但是這裏沒有'MyClass'構造函數定義。 – Stephan

回答

0

爲什麼我不能把int VALUE = 0;在test.h文件中?

如果VALUE是類變量的一部分,則不允許初始化爲類聲明的一部分。相反,應該使用構造函數初始值設定項列表。

// Constructor 

MyClass :: MyClass() : VALUE(0) 
        // ^^^^^^^^^^^ Initializer list 
{ } 

如何過,如果VALUE被定義爲一個全局變量那麼這也導致問題。如果在多個源文件中包含test.h,則會導致多個聲明錯誤。將其定義在源文件中,並使用關鍵字extern訪問多個翻譯單元。

0

compile => valgrind g ++ ./main 並查看是否有任何內存泄漏。

確保你已經安裝了valgrind,在其他情況下,你應該通過apt-get或ubuntu軟件中心安裝它。

希望這有助於..

0

我覺得很奇怪,編譯器不嚷嚷class是保留關鍵字。

無論如何,在我看來,使用method(MyClass &obj)並不是一個好主意,因爲你已經有了一個指針,它是dereferences,然後再次通過引用來獲取。我只是不知道它指的是什麼,這可能是警告出現的原因。

請嘗試以下,看看它是否仍然有同樣的警告,我現在不能測試:

test.h 
class MyClass 
{ 
public: 
    string Name; 
    MyClass(); 
    void method(MyClass* obj); 
} 

test.cpp 
void MyClass::method(MyClass* obj) 
{ 
    cout<<obj->Name<<endl; 
} 

main.cpp 
#include "test.h" 

void main() 
{ 
    MyClass *class = new MyClass(); 
    class->Name="Foo"; 
    class->method(class); 

    delete class; 
} 
+0

我需要使用.h文件中的方法中的對象的引用 – sunset

4

class在C++中的保留字,你不能把它作爲名字你變量。

此外,除非明確要求,否則不需要動態分配對象。如果可能,只需自動分配:

MyClass x; 
x.Name = "Foo"; 
x.method(x); 
0

它是正確的。解決問題的唯一方法是忘記刪除,刪除多次,或者使用或不使用括號來刪除新建和刪除之間的不匹配。但有幾點需要注意:

在你的exmpmle中,將參數作爲const引用傳遞是很好的,因爲你不會改變它。

void method(const MyClass &obj) const; 

,並在相應的CPP:

void MyClass::method(const MyClass &obj) const{ ... } 

你並不需要使用新的在所有在堆上分配的對象。事實上,你可以幾乎總是使用的語法時才這樣的:

void main() 
{ 
    MyClass obj; // <- allocates it on the stack 
    obj.Name="Foo"; 
    obj.method(obj); 
} 
// class is properly deleted when it goes out of scope 

每當你HABE大量的原始數據,特別是古典陣列,這些通常是因爲真棒STL的類成員(甚至這是一種罕見的情況下,像vector這樣的容器),你讓這個類處理內存管理。這又允許在堆棧上創建這些類,通過讓它們進入範圍來進行清理,並且類將保證大量數據實際存儲在堆中。

所以,當你的代碼是正確的,你實際上很少擔心因爲你

+0

THX FOR ADVICE!我將用你的想法再次測試代碼。謝謝 – sunset

0

貌似沒有內存泄漏和使用未初始化值。 Name成員將由其默認構造函數初始化。 Valgrind報告的錯誤可能來自標準庫或您可能使用的其他庫。還要注意,這個錯誤並不總是表示代碼中的錯誤。