我需要为数组中的每个元素提供std::set
的功能。我怎样才能实现这个功能?
我开始在C ++中分配std set的动态数组,如下所示:
set<int>* entry;
然后分配:
entry = (set<int>*)malloc(sizeof(set<int>)*32);
没有编译问题,但是当访问任何元素时,运行时失败并出现分段错误:
entry[0].insert(23);
非常感谢任何帮助。
答案 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)以真实的方式破坏。)
有些答案会包含说明你最好使用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 ++类一起使用。使用新的。