1、場景回現
前段時間我在參考了上面兩個資料之後簡單的用c++實現了一下反射機制,實現後想通過xml檔案讀入所想要的資料來建立類,但是通過tinyxml讀取資料後,在map想通過這個資料來找到我所需要的類,發現我傳入的這個引數name確實在我map裡有存在,但是經過stl中map自帶的find函式後,發現找到的結果是這個map的結尾,也就是說通過這個name我並不能在map中找到我所需要的資料。
以下是出現以上錯誤的全部**:
#include#include#include"xml\tinyxml.h"
using namespace std;
//乙個巨集定義
#define register(classname) \
registeraction::registerclass(#classname,classname::create)
class base
~base() {}
// 重寫實現
virtual void m_print() = 0;
};typedef base* (*classcreatecb)();
class testfactory
else
} //換言之是註冊
void addclass(const char* name, classcreatecb fun)
static testfactory* getinstance()
return instance;
}private:
mapn_fmap;
static testfactory* instance;
//工廠類也是一種單例類
testfactory() {};
};testfactory* testfactory::instance = null;
class testa :public base ;
~testa() {};
static base* create()
virtual void m_print() override
};class testb :public base ;
~testb() {};
static base* create()
virtual void m_print() override
};class testc :public base ;
~testc() {};
static base* create()
virtual void m_print() override
};class testd :public base ;
~testd() {};
static base* create()
virtual void m_print() override
};//工具類
class registeraction
return instance;
} static void registerclass(const char* name, classcreatecb fun)
void registerall()
private:
static registeraction* instance;
registeraction() {};
};registeraction* registeraction::instance = null;
int main()
tixmlnode* root = doc.firstchild("plist");
const char* c_stra = "testa";
const char* c_strb = "testb";
const char* c_strc = "testc";
const char* c_strd = "testd";
if (!root)
else
else base->m_print();
} }system("pause");
}
2、問題解決:
當時出現這個問題的時候我認為是編碼上的問題,各種修改後無果便放到一旁了,今天再一次用到tinyxml的時候發現了乙個類似的錯誤,觀察了記憶體之後,發現tinyxml是先將這個檔案全部讀入到記憶體中,然後通過tinyxml來獲取所需的資料時,返回出來的資料就是在這個記憶體塊上面的,然後當tixmldocument的析構函式被呼叫時,這個記憶體區上所存放的所有資料都會被清空!
到這裡問題就很明確了,比如說乙個在xml中存放的乙個字串「testa」,這個字串所在的記憶體位址和通過乙個const char*所建立出來的字串「testa」是不一樣的,後者是儲存在專門存放文字常量的文字常量區中,而從這裡我們可以知道,之前的錯誤發生有乙個原因就是因為stl中的find之間的比較應該是直接通過==操作符來實現,對於乙個const char*型別的資料,他們==操作符所比較的是兩個資料之間的位址,只有當位址一樣時這兩個值才會一樣,也就因此造成了find函式的失效。
解決方法其實很簡單,將map中的const char*換成string就解決了,如下:
mapn_fmap;
對於string而言其==所比較的是其內容,會造成這樣的原因也就消失了,而且string在建立的時候等於會複製一段這個字串的內容,也就避免了你建立了乙個指向tinyxml存放的字串後由於記憶體被收回導致的一些錯誤。
第一次寫文,見諒
STL中map和priority queue的應用
基本的知識就不再講了,只列下用map做的題目 題1 poj 1002 487 3279 這個題目煩的死,tle了n次,只是因為我用g 提交的,好啦,要注意的就是把陣列開大點,和用c語言輸入,最後如果沒有重複的 號碼輸出 no duplicates.include include include in...
STL中的map和multimap小結
1 使用map multimap之前必須包含標頭檔案 include並且和所有的關聯式容器一樣,map multimap通常以平衡二叉樹來完成 2 namespacestd 第乙個template引數被當作元素的key,第二個當作元素的value。key value必須具備assignable和co...
STL中map用法詳解
map是stl的乙個關聯容器,它提供一對一 其中第乙個可以稱為關鍵字,每個關鍵字只能在 map中出現一次,第二個可能稱為該關鍵字的值 的資料處理能力,由於這個特性,它完成有可能在我們處理一對一資料的時候,在程式設計上提供快速通道。這裡說 下map內部資料的組織,map內部自建一顆紅黑樹 一種非嚴格意...