0

我想知道为什么我有一个内存错误:

问题出现在 char* value = aMap.find(keync)->second

如果我手动输入 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;
}
4

6 回答 6

2

您需要将 1 添加到数组的长度:

char* keync = new char[LEN+1];

您在分配的字符串之外以空值结尾。

(另外,你在初始化 aMap 吗?)

于 2010-08-30T04:24:47.447 回答
1

正如其他人指出的那样,你最好使用std::string它。现在,对于您无法找到字符串的实际问题是因为您将指针存储在映射中,即映射的键是指针变量。您在地图中插入了一个char*,但是当您试图找到时,您new又在做一个。这是一个完全不同的指针(尽管它们指向的字符串值相同),因此您的查找将失败。

于 2010-08-30T04:55:49.583 回答
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;
于 2010-08-30T04:24:54.717 回答
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;
}

您遇到的问题是因为您分配keyncstrlen(key)不是空终止符。然后在您的复制循环中,您使用key.

复制输入字符串的整个想法是错误的,我在我的解决方案中将其替换为 const 转换,因为它更有意义(就目前而言)。

于 2010-08-30T04:27:02.030 回答
0

一个明显的问题是:

delete keync;

因为你使用了 new [],它应该是:

delete[] keync;
于 2010-08-30T04:18:40.377 回答
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;

在这里,您通过比较指针值(地址)来执行搜索,因此返回的映射迭代器无效(它等于 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 *

于 2010-08-30T08:00:02.190 回答