作者ilway25 (唉唷喂)
看板EE_DSnP
標題Re: [心得] memcpy 和 memmove
時間Fri May 22 23:14:00 2009
※ 引述《ilway25 (唉唷喂)》之銘言:
: 今天在用這兩個實作時,遇到一大堆問題,因此又想了一大堆...
: 以下是其中的一個想法:
: 以作業中的 AdtTestObj 來說,是沒有的。
: 但是,如果那個 Class 的 assignment operator 有做事情的話,
: 用 memcpy 結果不得而知。
: 結論是:不可以用 memcpy。
: 但就這次作業而言,到底可不可以求速而用 memcpy 呢?
我指的是,如果我們不是放 AdtTestObj,
而是要把 adt 做得更通用的話,不應該用 memcpy 吧?
如下面的程式:
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
int main()
{
string b;
{
string a = "test";
memcpy(&b, &a, sizeof(a));
}
string c = "123";
cout << b << endl;
return 0;
}
不但 cout 出 b 的內容變成 123,結束時還出現 double free。
所以我不打算在作業中用 memcpy or memmove @@
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.245.11
1F:推 goodword:我想會出錯最大的原因應該是 string 內應該是char* 吧 05/22 23:27
2F:→ goodword:然後你的變數a 只在那個scope內 05/22 23:27
3F:→ goodword:然後又宣告一個變數c 當然c的位置就是用a的位置了 05/22 23:28
4F:→ goodword:我說錯了 string a 的destructor 應該有把test delete掉 05/22 23:29
5F:→ ilway25:所以adt如果用memcpy,那麼我們放string進去,就會爆了!! 05/22 23:29
6F:→ goodword:然後123 又寫上去同一塊位置 但b又是複製4個過去 05/22 23:31
7F:→ goodword:所以最後1格 就double free了 在b的destructor 05/22 23:32
8F:→ goodword:嗯嗯 應該是這樣 所以我在作業中也都沒用那兩個啊 05/22 23:32
9F:推 ric2k1:對耶... 嗯, 以後要改寫了... 05/23 00:38