【问题标题】:Using malloc and sizeof for a pointer to a C++ class [closed]使用 malloc 和 sizeof 作为指向 C++ 类的指针 [关闭]
【发布时间】:2013-07-17 23:11:00
【问题描述】:

以下可以吗?

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++ 规范的参考,表明我正在做的事情是未定义的。所以这个问题还是没有答案。

【问题讨论】:

  • 你不应该这样做。
  • 不,完全不行。
  • 大错特错。使用std::vector&lt;std::map&lt;std::string, int&gt;&gt;。没有malloc,没有new,没有任何借口。
  • 显然,愤怒和愤怒发生了。
  • 您为什么要这样做? C++ 中到处都是 C 来初始化 C++ 容器?没有。

标签: c++ pointers syntax malloc sizeof


【解决方案1】:

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

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

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

编辑: 刚刚意识到您确实尝试通过以下方式使地图有效:

maps[i] = map&lt;string,int&gt;();

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

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

【讨论】:

  • 提及内存泄漏,我会回复我的 +1
  • 是的,我知道内存泄漏。我可以只使用 free 或 delete ,但这不是问题的重点。
  • @onelineproof 供将来参考,C++ 有一个名为 POD 的类别,用于不需要构造的类。您可以在编译时使用std::is_pod 查询一个类是否为 POD。下面是一个例子:ideone.com/gZ0sqH(注意 std::is_pod 可能不会在旧编译器上实现)。
【解决方案2】:

指令:

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

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

然后

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

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

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

【讨论】:

  • @Mooing Duck:感谢编辑
  • 是的,我不确定这一行 (maps[i] = map();)。但它确实编译并且似乎给出了理智的结果。
  • 您的程序展示了undefined behavior。 “似乎给出了理智的结果”是未定义行为的一种可能表现。
猜你喜欢
  • 2017-05-13
  • 1970-01-01
  • 1970-01-01
  • 2021-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-17
  • 2018-08-26
相关资源
最近更新 更多