tinyXml和stl中map使用的一點坑

2021-08-04 12:47:20 字數 2789 閱讀 1721

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內部自建一顆紅黑樹 一種非嚴格意...