2011-09-01 52 views
1

在下面的代碼:分配值一個空的char *

const char * my_func1(char const *str) 
{ 
    const char *a = func(); // returns a char *, but I guess its ok to assign non-const to const 
    if(a == NULL) 
    { 
     MY_String b = str;  //MY_String is an inhouse class with string functions 
     b.replace("\"", "\'"); //replace " with ' 
     a = (const char *)b; //MY_string has an operator (const char *) 
    } 

    return a; 
} 

我遇到的問題是,當anull,並進入if塊,分配給a工作不正常,我得到垃圾。是因爲anull我無法給它賦值?我該如何解決?

+0

您如何確定「對a的分配不正常」?另外,什麼是'MY_String'? –

+3

你的代碼是非常不透明的。我們不知道'func'是什麼或'MY_String'是什麼,'replace'方法實際上做了什麼,轉換操作符做了什麼,等等。如果'My_String'管理它自己的內存,你會返回一個指向一個'刪除[]'內存塊。 –

+0

@Oli Charlesworth這是因爲,我可以在調試器中運行它,並停止在'返回',並看到一個垃圾..但讀完評論後,我覺得這個任務正在工作,但超出了範圍之後如果阻止 – tryurbest

回答

7

我不知道什麼MY_String是。但不管它是什麼,它都是一個局部變量。因此它在if區塊的末尾超出範圍。因此,不管它的operator const char*如何,一旦底層對象被破壞,它可能不會給你明智的結果。

這可能有效的唯一方法是,如果重載操作符動態分配一個新的緩衝區,並返回一個指針。但那是荒謬的。

+0

所以你的回覆很有道理,我該如何避免這種情況呢? MY_String是一個字符串類。我使用它的唯一原因是使用替換功能。我可以不使用該類,並手動進行搜索並替換一個。 – tryurbest

+0

@tryurbest:一種可能的解決方法是從'my_func1'而不是'const char *'返回'std :: string'或'MY_String'。另一種方法是使用'strdup((const char *)b)'或類似方法來獲取字符串數據的副本,並確保調用者將其釋放(這意味着當您返回'a'時,您將不得不也複製)。另一種方法是讓調用者傳入另一個參數,一個指向可寫緩衝區的指針,其長度足以容納結果數據(如果可以預測的話)。您將字符串數據複製到該數據中而不是返回指針。最簡單的方法是返回'std :: string'。 –

0

當然,即使它是NULL,您也可以指定爲a。你不能做的是分配到*a

b是否爲其成員使用自動存儲?如果是這樣,請確保您沒有返回指向其中一個來自轉換運算符的指針,因爲一旦b超出範圍,它將變爲無效。

+0

是的我認爲我的主要問題是b超出範圍.. – tryurbest

1

這是很難說,沒有看到MY_String的實際接口,但我會通過您的意見承擔其行爲。

它看起來像你分配到a緩衝區分配在b。但是b在if塊的末尾被取消分配。所以b被銷燬,所以他的緩衝區(我認爲)。

這就解釋了爲什麼你的a指向垃圾。

0

那麼,b不在if區塊之外的範圍內。要解決這個問題,首先需要爲a分配一些內存(使用new)。儘管如此,這不是非常類似於C++的情況,而且您可能很容易導致內存泄漏,並且無法完成整個操作。