std ::为数组中的每个元素设置

时间:2012-07-04 11:26:19

标签: c++ arrays memory-management vector set

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

我开始在C ++中分配std set的动态数组,如下所示:

set<int>* entry;

然后分配:

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

没有编译问题,但是当访问任何元素时,运行时失败并出现分段错误:

entry[0].insert(23);

非常感谢任何帮助。

5 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:5)

在c ++中,您使用new分配内存。与malloc的不同之处在于调用构造函数来初始化内存。

entry = new set<int>[32];

答案 2 :(得分:4)

即使你已经为32 std::set分配了存储空间,你还没有把这段内存(也就是你的std::set的构造函数没有被调用)放在一起,因此记忆您尝试在entry[0].insert (23) 操作/访问将导致undefined behavior

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

转而使用operator new来分配内存并以正确的方式处理对象的构造,还记得delete分配的内存以释放内存回系统(并使对象成为对象) (s)以真实的方式破坏。)


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

有些答案会包含说明你最好使用std::vector<std::set>的文字,虽然这不是你问题的真正答案所以我会留下这个示例代码段< / EM>

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

  entries[0].insert (123);

  delete [] entries;
}

答案 3 :(得分: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;
}

答案 4 :(得分:1)

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