2013-06-05 63 views
0

我寫了下面的代碼,並得到上述雙重釋放或腐敗(fasttop):

提到的錯誤誰能告訴我在哪裏,我錯了

感謝。

#include "iostream" 
#include "sstream" 
#include <string.h> 

int main() 
{ 
    std::string temp1 = "454552354772"; 
    char arr[16]; 
    memcpy(arr , &temp1 , temp1.size()); 
    std::string temp2; 
    memcpy(&temp2 , arr , temp1.size()); 
    std::cout<<temp2; 

} 

我得到的錯誤是

*** Error in `./a.out': double free or corruption (fasttop): 0x00000000016c5010 *** 
======= Backtrace: ========= 
/lib/x86_64-linux-gnu/libc.so.6(+0x80a46)[0x7fa91d359a46] 
/usr/lib/x86_64-linux-gnu/libstdc++.so.6(_ZNSsD1Ev+0x20)[0x7fa91dc78290] 
./a.out[0x400bc9] 
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5)[0x7fa91d2faea5] 
./a.out[0x400a09] 
+1

複製到'std :: string'的地址是不可能的。不是沒有調用各種未定義的行爲。 – jogojapan

+0

我只是從std :: string rite指出的地址複製數據? – user2454413

+0

我的意思是第二個'memcpy'語句。你從一個數組直接複製到一個'std :: string'對象中。不要這樣做。 – jogojapan

回答

1

你不能用string類這樣的對象。

memcpy(arr , &temp1 , temp1.size()); 

應該

temp1.copy(arr, temp1.size()); 

而且

memcpy(&temp2 , arr , temp1.size()); 

應該

std::string temp2(arr, temp1.size()); 
+0

感謝這個作品 – user2454413

0

std::string是一個動態分配的容器。您應該很少將其用作memcpy的目的地。在您的代碼中,沒有爲temp2分配內存。解決方法是使用string::reserve預先分配內存。

然而,通常不需要用C++混合C-代碼(memcpychar[]) - 代碼(std::stringstd::cout)。顯然,你做錯了什麼。

0

如果從字符串的位置(它也包含函數,其他數據等)複製並複製16個字節,則最終會產生大量不可用的數據。

你想在字符串中的第一個字符,所以你可以這樣做: memcpy(arr, &temp1[0], temp1.size());

這將有效地複製它。 當你想做相反的事情(複製到字符串),爲什麼不做這個? std::string temp2(arr, temp1.size());std::string temp2((const char*) arr);

相關問題