我想知道为什么我有这样的内存错误:
问题出现在char * value = aMap.find(keync) - > second
如果我把manualy char * value =“key0”就可以了!!!
using std::map;
map <char*, char*> aMap;
void search(const char* key) {
const int LEN = strlen(key);
char* keync = new char[LEN];
for (int i= 0; i < LEN; i++) {
keync[i] = key[i];
}
char* value = aMap.find(keync)->second;
printf("%s", value);
delete[] keync;
}
int _tmain(int argc, _TCHAR* argv[])
{
a["key0"] = "value0";
search("key0");
return 0;
}
答案 0 :(得分:2)
您需要在数组长度上加1:
char* keync = new char[LEN+1];
你在你分配的字符串之外终止了。
(另外,你是在初始化地图吗?)
答案 1 :(得分:1)
正如其他人指出的那样,你最好使用std::string
。现在,对于实际问题,为什么你不能找到字符串是因为你在地图中存储指针,即地图的关键是指针变量。您在地图中插入了char*
,但是当您尝试查找时再次执行new
。这是一个完全不同的指针(尽管它们指向的字符串值相同),因此您的查找将失败。
答案 2 :(得分:0)
一个显而易见的问题是:
delete keync;
因为您使用了新的[],所以应该是:
delete[] keync;
答案 3 :(得分:0)
你最好使用std :: string而不是char *。使用std :: string的另一个好处是你可以避免内存泄漏。
另一种解决方案是提供带比较器功能的map,否则他们不会比较每个char *的内容,而是指向地址。以下示例改编自Sgi的std::map文档:
struct comp
{
bool operator()(char* s1, char* s2) const
{
return strcmp(s1, s2) < 0;
}
};
map<char*, char*, comp> stringMap;
答案 4 :(得分:0)
好好寻找初学者,你应该放弃所有的char *并使用std::string
,这可能会让你的问题消失。
供参考:
keync[LEN] = '\0';
//这是错误的,并且将超过分配的数组
复制关键参数是错误的。试试这个尺寸:
using std::map;
map <char*, char*> aMap;
void search(const char* key) {
const int LEN = strlen(key);
char* keync = const_cast<char*>(key);
char* value = aMap.find(keync)->second;
printf("%s", value);
}
int main(int argc, char** argv)
{
aMap["key0"] = "value0";
search("key0");
return 0;
}
您遇到的问题是因为您将keync
分配为strlen(key)
,而不计算空终止符。在您的复制循环中,您使用key
的最后一个字符覆盖空终止符。
复制输入字符串的整个想法是错误的,我已经用我的解决方案中的const转换替换它,因为它更有意义(就此而言)。
答案 5 :(得分:0)
using std::map;
map <char*, char*> aMap;
首先,这个地图不会比较字符串(搜索内部)而是地址。所以基本上你不会通过输入字符串文字来找到std :: map :: search的任何内容。
void search(const char* key) {
const int LEN = strlen(key);
char* keync = new char[LEN];
for (int i= 0; i < LEN; i++) {
keync[i] = key[i];
}
此时您有未终止的字符串,但在您的代码中无关紧要
char* value = aMap.find(keync)->second;
这里你通过比较指针值(地址)来执行搜索,因此返回的map迭代器无效(它等于aMap.end()),因此它具有null或未分配的指针作为second
成员
printf("%s", value);
delete[] keync;
}
int _tmain(int argc, _TCHAR* argv[])
{
a["key0"] = "value0";
search("key0");
return 0;
}
我希望它能解释你为什么要使用std :: string而不是char *