[問題] string與一般型別的相異處

看板C_and_CPP作者 (ooee)時間15年前 (2010/10/13 13:16), 編輯推噓12(12042)
留言54則, 10人參與, 最新討論串1/1
( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 ) ( 未必需要依照此格式,文章條理清楚即可 ) 遇到的問題: (題意請描述清楚) 使用template做成的class,套用一般型別如int,double等可以正常執行, 改用string套入出現錯誤。 程式跑出來的錯誤結果: 存取違規 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) VC++ 有問題的code: (請善用置底文標色功能) #include <iostream> #include <string> using namespace std; template <class T> class c { public: T data; }; template <class T> class cc:public c<T> { public: void f(T i); }; template <class T> void cc<T>::f(T i) { cc *cc2; cc2=(cc *)malloc(sizeof(cc<T>)); cc2->data=i; //此行無法如預期執行功能 cout<<cc2->data<<endl; } int main() { c<string> *c1; cc<string> c2; c1=&c2; c2.f("string"); } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.171.128.133

10/13 13:19, , 1F
都寫 class 了就別 malloc 了...用個 new 吧同學
10/13 13:19, 1F

10/13 13:19, , 2F
malloc 不會呼叫 constructor 要寫C++就全部改用new吧
10/13 13:19, 2F

10/13 13:20, , 3F
再說你在 cc 裡又做一個 cc 出來是怎麼回事...
10/13 13:20, 3F

10/13 13:21, , 4F
洋基王牌CC 殺巴西亞
10/13 13:21, 4F

10/13 13:24, , 5F
code是針對問題寫的,原本要以class當做node做成linked list
10/13 13:24, 5F

10/13 13:28, , 6F
感謝2F,忘記考慮constructor的問題了!
10/13 13:28, 6F

10/13 13:29, , 7F
void f(T i);改成void f(T* i);會不會比較好
10/13 13:29, 7F

10/13 13:31, , 8F
win的引數是8BYTE ,String就爆掉了,int當然不會爆
10/13 13:31, 8F

10/13 13:35, , 9F
push 1次是8BYTE,學組語的應該都知道,double是push 2次
10/13 13:35, 9F

10/13 13:45, , 10F
push 1次是 8BYTE,這...你是用 64 位元才有8吧
10/13 13:45, 10F

10/13 13:46, , 11F
對吼,寫錯是4BYTE
10/13 13:46, 11F

10/13 13:47, , 12F
我以為s大這麼先進,已經跳64了
10/13 13:47, 12F

10/13 13:48, , 13F
程式用途中應該不會輸入長字串,不過還是謝謝提醒。
10/13 13:48, 13F

10/13 15:03, , 14F
說不定string是動態變長,這時候就會發生錯誤
10/13 15:03, 14F

10/13 15:05, , 15F
<-沒用過string,隨便說說
10/13 15:05, 15F

10/13 16:27, , 16F
string有固定大小,可以用sizeof()看。
10/13 16:27, 16F

10/13 16:32, , 17F
新問題,既然malloc沒呼叫constructor,為什麼int不會出錯?
10/13 16:32, 17F

10/13 16:57, , 18F
string有固定大小,可以用sizeof()看 <== 這句好像...
10/13 16:57, 18F

10/13 17:06, , 19F
你認為 int 會有 constructor 這種東西嗎?
10/13 17:06, 19F

10/13 17:06, , 20F
雖然語法上有類似的東西,但實質上並不是。
10/13 17:06, 20F

10/13 17:08, , 21F
我的意思是指上面的程式碼,樣板套用int時可以執行
10/13 17:08, 21F

10/13 17:14, , 22F
照你的程式碼,實際上多複製了兩個相同的string
10/13 17:14, 22F

10/13 17:34, , 23F
T data;變成string data時沒有初始化,沒地方放字串
10/13 17:34, 23F

10/13 17:35, , 24F
又怎麼可能複製字串呢,一定是存取錯誤
10/13 17:35, 24F

10/13 18:05, , 25F
s大的意思是指,因為class沒有建構,所以T data格式不明嗎?
10/13 18:05, 25F

10/13 18:07, , 26F
但是當T data=>int data時,應該會遇到同樣的問題。
10/13 18:07, 26F

10/13 18:07, , 27F
所以我現在變成懷疑他怎麼能work了XD
10/13 18:07, 27F

10/13 18:09, , 28F
string在初始化時一定要分配字串空間
10/13 18:09, 28F

10/13 18:10, , 29F
int不用初始化,本身就是存放資料
10/13 18:10, 29F

10/13 18:11, , 30F
cc2=(cc *)malloc(sizeof(cc<T>));T=string發生什麼事
10/13 18:11, 30F

10/13 18:12, , 31F
string沒申請字串空間,要是運氣好說不定可以跑
10/13 18:12, 31F

10/13 18:14, , 32F
也說是string中的指向字串的指標跟本是空的
10/13 18:14, 32F

10/13 18:15, , 33F
而int跟double本身就是存放的空間,所以不會有這個問題
10/13 18:15, 33F

10/13 18:24, , 34F
我沒用過string,以上是我亂猜的
10/13 18:24, 34F

10/13 21:11, , 35F
string 和 int 完全不能相提並論啊....
10/13 21:11, 35F

10/13 21:18, , 36F
說實在string這東西很難用,WinAPI都是TCHAR*
10/13 21:18, 36F

10/13 21:20, , 37F
我會覺得樓上所說的...難用的是WinAPI耶 XDDD
10/13 21:20, 37F

10/13 21:26, , 38F
string 怎麼會難用...
10/13 21:26, 38F

10/13 21:36, , 39F
你看原po不是用的很多問題嗎
10/13 21:36, 39F

10/13 21:39, , 40F
剪刀很好用, 但是不會用就會剪到自己的手, 然後拿安
10/13 21:39, 40F

10/13 21:39, , 41F
全剪刀真的會比真剪刀還要實在?
10/13 21:39, 41F

10/13 21:43, , 42F
cc2=(cc *)malloc(sizeof(cc<T>));
10/13 21:43, 42F

10/13 21:44, , 43F
這種寫法把 string 換成其他類別應該出問題的機率頗高
10/13 21:44, 43F

10/13 21:55, , 44F
我不知道哪個安全,但是你前一句"我沒用過string",後一句
10/13 21:55, 44F

10/13 21:55, , 45F
"string這東西很難用" 你要別人不把你當孝ㄟ也很難...
10/13 21:55, 45F

10/13 21:56, , 46F
沒用過的東西你都能直接說難用了,你還期望別人怎麼看你 :Q
10/13 21:56, 46F

10/13 22:01, , 47F
有的人會覺得自己來控管記憶體比較安全, 不過我覺得有
10/13 22:01, 47F

10/13 22:02, , 48F
用 string 的程式比較好抓到問題點在哪, 甚至更好回復
10/13 22:02, 48F

10/13 22:03, , 49F
要本來合法的狀態, 對我來說才是安全
10/13 22:03, 49F

10/13 22:07, , 50F
^到
10/13 22:07, 50F

10/16 21:20, , 51F
`string有固定大小,可以用sizeof()看` ...
10/16 21:20, 51F

10/16 21:21, , 52F
sizeof不是拿來看動態記憶體使用量用的
10/16 21:21, 52F

10/17 07:11, , 53F
我以為string=32byte資料,不用管buffer有多大@@
10/17 07:11, 53F

10/18 00:07, , 54F
To樓上:絕對沒這回事
10/18 00:07, 54F
文章代碼(AID): #1CjK2uIt (C_and_CPP)