2013-10-30 45 views
0

管理內存我不熟悉的客觀C++,這裏是我的問題:假設我有一個類我怎麼能在客觀C++

class MyTestClass 
{ 
public: 
    int memLength_; 
    char *mem; 
    MyTestClass(int memLength) 
    { 
     memLength_ = memLength; 
     mem = new char[memLength_]; 
    } 
    ~MyTestClass() 
    { 
     delete []mem; 
    } 

} 

現在我想要做的就是使用創建MyTestClass對象客觀的C++,和我所做的是如下:

@interface ObjectRetriever : NSObject 
+ (MyTestClass)ObtainMyTestClass; // Function 1 
+ (MyTestClass*)ObtainMyNextTestClass; //Function 2 
@end 

+(MyTestClass)ObtainMyTestClass 
{ 

    int memLen = 100; 

    MyTestClass myClass(memLen) 
    return myClass; 

} 
+ (MyTestClass*)ObtainMyNextTestClass 
{ 

    MyTestClass *myClassPtr; 
    myClassPtr = new MyTestClass(memLen) 
    return myClassPtr; 
} 

所以,當我使用ObjectRetriever創建MyTestClass對象,我會以這種方式

做個

我的問題則是:

  • ObtainMyTestClassObtainMyNextTestClass,哪一個更好?
  • 如果我以這種方式實現和使用類,是否會有內存泄漏的危險?

謝謝。

+1

「使用該類的操作符」?!?你的意思是「構造函數」? –

+0

您是否考慮過使用[C++ 11](http://en.wikipedia.org/wiki/C%2B%2B11)? –

+0

@KerrekSB在這裏,我的意思是使用類 – feelfree

回答

0

首先,短期回答您的具體問題

如果我實施和使用類以這種方式,我將有內存泄漏的危險?

是的。如果將來不刪除[] int數組,它將會丟失。另外,在第二個(指針)實現中,您可能會失去MyTestClass實例。

ObtainMyTestClass和ObtainMyNextTestClass,哪一個更好?

ObtainMyTestClass,因爲不會有丟失MyTestClass實例的危險。

現在是漫長的一部分。主要的問題是,我不清楚你真正想要什麼。問題標題顯示您希望乾淨地管理(即保留/釋放)您的數據。但是,在說明中,您聲明數據由您班級的用戶手動管理,並且您希望以此方式進行。然後,在您的代碼示例中,您嘗試將兩者混合使用(數組新增由ObjectRetriever自動完成,數組刪除取決於用戶)。所以,這裏有我的建議:

a)如果你想讓內存管理由用戶決定,你不需要Objective-C包裝類。在使用Objective-C++時,可以使用與C++中完全相同的MyTestClass,就像在第二個代碼塊中一樣。 b)如果你想要安全的內存管理,並且你不能或不想改變MyTestClass,我建議把int數組的創建和刪除包裝在一個ObjC對象的init和dealloc中。這應該在有或沒有ARC的情況下工作。

@interface TestClassWrapper :NSObject{ 
     int* array; 
    } 
    -(MyTestClass) getTestClass; 
    @end 

    @implementation TestClassWrapper 
    -(id)init{ 
     if(![super init])return nil; 
     array=new int[100]; 
     return self; 
    } 
    -(void)dealloc{ 
     delete[] array; 
     [super dealloc]; 
    } 
    -(MyTestClass)getTestClass{ 
     return MyTestClass(100,array); 
    } 

    } 
    @end 

c)如果您想安全的內存管理,並且可以和想改變MyTestClass,我建議重寫MyTestClass就不需要EXTERN內存管理。

+0

謝謝,現在對我來說很清楚。根據你的c)建議,我決定讓MyTestClass自己管理內存。如果我這樣做,你能回答我的兩個問題嗎? – feelfree

+0

隨着您的修改,問題歸結爲是使用堆棧上還是堆上的對象。那麼,這取決於MyTestClass的語義和程序的意圖(例如:MyTestClass的複製構造函數是否深度複製數據,還是隻是將指針複製到數據?)。在作爲C++的非內存管理環境中,我傾向於更喜歡堆棧對象,因爲您永遠不會忘記刪除。當你使用cxx11時,你也可以看看std :: shared_pointer。請注意,無論如何,您可能需要仔細實施複製構造函數,析構函數和賦值運算符。 – fieres