4

我需要一个std::set数组中每个元素的功能。我怎样才能实现这个功能?

我首先在 C++ 中分配标准集的动态数组,如下所示:

set<int>* entry;

其次是分配:

entry = (set<int>*)malloc(sizeof(set<int>)*32);

没有编译问题,但是在访问任何元素时运行时会因分段错误而失败:

entry[0].insert(23);

非常感谢任何帮助。

4

5 回答 5

11

关于什么

#include <set>
#include <vector>

int main()
{
        std::vector < std::set<int> > entry(32); // std::vector constructor makes 32 calls to std::set<int> constructor
        entry[0].insert(23);
        // std::vector destructor makes 32 calls to std::set<int> destructor
}
于 2012-07-04T11:30:19.093 回答
5

在 c++ 中,您使用new. 这里与 malloc 的区别在于调用构造函数来初始化内存。

entry = new set<int>[32];
于 2012-07-04T11:30:01.367 回答
4

即使您已经为 32 分配了存储空间,std::set您还没有初始化这段内存(即std::set尚未调用您的构造函数),因此您尝试操作/访问的内存entry[0].insert (23)将导致未定义的行为.

将 C++ 对象与malloc它的等价物混合通常(我很想写“总是”)被认为是不好的做法。

相反,转向operator new哪个将分配内存并以适当的方式处理对象的构造,还要记住delete分配的内存以将内存释放回系统(并使对象以真正的方式销毁)。


在 C++ 中执行此操作的正确方法

一些答案将包含说明您最好使用 a 的文字std::vector<std::set>,尽管这并不是您问题的真正答案,所以我将把这个示例片段留给您

int
main (int argc, char *argv[])
{
  std::set<int> *entries = new std::set<int> [32]; 

  entries[0].insert (123);

  delete [] entries;
}
于 2012-07-04T11:34:12.987 回答
2

这是一个很好的问题,但它的答案并不是很明显。问题是每个set对象都希望在使用之前被初始化,而您的代码只为每个对象分配原始内存set。这修复了它:

#include <vector>
#include <set>

using std::vector;
using std::set;

const int N = 32;

int main() {
    vector< set<int> > entry(N);
    entry[0].insert(23);
    return 0;
}
于 2012-07-04T11:37:23.353 回答
1

不要尝试将 malloc/calloc/realloc 等与 c++ 类一起使用。使用新的。

于 2012-07-04T11:31:05.047 回答