使用malloc和sizeof作为指向C++类的指针



以下内容可以吗?

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++规范的引用,以表明我所做的是未定义的。所以这个问题仍然没有得到回答。

主要问题是映射的构造函数不会运行。

如果没有构造函数,映射将处于无效状态,无法正常工作。

可以使用placementnew手动调用构造函数。

编辑:刚刚意识到你确实试图用使地图有效

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

然而,这将不起作用,因为映射在被复制到之前需要处于有效状态(由于尚未构建,因此当前无效)。

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

指令:

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

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

然后

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

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

你也失去了很多内存,因为你从来没有freemalloc的内存。

相关内容

  • 没有找到相关文章