-6

以下可以吗?

int n=5;
map<string,int> * maps = (map<string,int> *)malloc(n*sizeof(map<string,int>));
for (int i=0; i<n; i++) {
    maps[i] = map<string,int>();
    char * i_str = (char *)malloc(10);
    sprintf(i_str,"%d",i);
    char * key = (char *)malloc(100);
    strcpy(key,"key");
    strcat(key,i_str);
    (maps[i])[string(key)] = i*i;
}

我知道人们说在 C++ 中使用 new 而不是 malloc。但是如果我这样做,如果出现任何问题怎么办?

编辑:代码编译良好并且运行良好(g++ 4.6.3)。不知道为什么这个问题被搁置,但我只想知道它在技术上是否正确(我不关心风格)。我不确定的一件事是这条线是否

maps[i] = map<string,int>();

在语法上是正确的,以及它是否真的会导致一个人建议的意外行为。

有人还没有提供对 C++ 规范的引用,表明我正在做的事情是未定义的。所以这个问题仍然没有答案。

4

2 回答 2

3

主要问题是地图的构造函数不会运行。

没有构造函数,地图将处于无效状态,无法正常工作。

您可以使用placement new 手动调用构造函数。

编辑:刚刚意识到您确实尝试使地图有效:

maps[i] = map<string,int>();

但是,这将不起作用,因为地图需要处于有效状态才能被复制到其中(并且它目前在该点无效,因为它尚未构建)。

您的程序中也存在许多内存泄漏。确保使用智能指针(请注意,您需要使用new智能指针才能工作)或free每次分配。

于 2013-07-17T23:20:48.720 回答
2

指令:

map<string,int> * maps = (map<string,int> *)malloc(n*sizeof(map<string,int>));

为存储地图保留内存,但不初始化内存(调用构造函数)。这里的地图构造函数很可能需要额外的动态分配。

然后

maps[i] = map<string,int>();

调用地图的复制分配operator=,它应该清除地图的先前内容,并将其替换为新的(空白)内容。但是,由于以前的地图处于无效状态,因此您很可能会在这里遇到麻烦。这是未定义的行为,可能什么都不做,或者它可能会崩溃,或者随机做其他随机的事情。

你也失去了很多记忆,因为你从来没有你free的记忆malloc

于 2013-07-17T23:23:46.477 回答