2016-12-24 80 views
-2

我也評論了代碼,表明我的擔憂,我會很感激任何幫助。我在這個C++代碼中做錯了什麼?我應該知道的最佳做法是什麼?

#include <cstdlib> 
#include <iostream> 
#include <cstring> 
#include <string> 

int main() 
{ 
    std::string str ("Please split this sentence into tokens"); 

    const char * cstr = (char *)malloc((sizeof(char)) * str.size()); 
    cstr = str.c_str(); 

    const char *p = std::strtok((char *)cstr, " "); 
    while (p != 0) { 
     std::cout << p << '\n'; 
     p = std::strtok(NULL, " "); 
    } 

    delete[] cstr; // Why not "delete cstr;" 

    return 0; 
} 

我簡單的編譯的 「g ++ -Wall code.cpp」,我跑了./a.out如下:

請這句話分成令牌 *錯誤`。 /a.out':雙重空閒或損壞(fasttop):0x0000000001434c20 * ======= Backtrace:========= /usr/lib/libc.so.6(+0x70c4b) [0x7f2d781a8c4b] /usr/lib/libc.so.6(+0x76fe6)[0x7f2d781aefe6] /usr/lib/libc.so.6(+0x777de)[0x7f2d781af7de] ./a.out[0x400c97] /USR /升IB/libc.so.6的(__ libc_start_main +的0xf1)[0x7f2d78158291] ./a.out[0x400afa] =======存儲器映射:======

+5

投票結果過於寬泛,因爲它需要編寫一半的C++書來體面地解釋這裏出現的所有錯誤。請閱讀其中一本很好的現有C++入門書籍。 –

+0

你讓點cstr到string :: c_str(const char *)的結果,然後用strtok()修改它 - UB – LWimsey

+2

第一行開始沒問題。然後突然出現了一個瘋狂的'malloc',它從那裏走下坡...... –

回答

1

這語句cstr = str.c_str();將您的指針設置爲指向由str管理的緩衝區。所以就在那裏你泄漏你從malloc獲得的內存。

然後,您繼續修改該緩衝區std::strtok;非常糟糕的形式。編譯器不僅試圖阻止你,而且你通過演員陣營沉默了它。

最後,你delete[]內存,你甚至沒有分配你自己。這會導致str釋放您已經發布的內存。

您錯誤的一般主題!?混合C和C++習語。如果你想編寫好的C++,你需要熟悉它的庫。在這種情況下,std::string,而不是在您自己分配的不是C字符串的任何內容上應用c-string庫函數。