我需要一个std::set
数组中每个元素的功能。我怎样才能实现这个功能?
我首先在 C++ 中分配标准集的动态数组,如下所示:
set<int>* entry;
其次是分配:
entry = (set<int>*)malloc(sizeof(set<int>)*32);
没有编译问题,但是在访问任何元素时运行时会因分段错误而失败:
entry[0].insert(23);
非常感谢任何帮助。
我需要一个std::set
数组中每个元素的功能。我怎样才能实现这个功能?
我首先在 C++ 中分配标准集的动态数组,如下所示:
set<int>* entry;
其次是分配:
entry = (set<int>*)malloc(sizeof(set<int>)*32);
没有编译问题,但是在访问任何元素时运行时会因分段错误而失败:
entry[0].insert(23);
非常感谢任何帮助。
关于什么
#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
}
在 c++ 中,您使用new
. 这里与 malloc 的区别在于调用构造函数来初始化内存。
entry = new set<int>[32];
即使您已经为 32 分配了存储空间,std::set
您还没有初始化这段内存(即std::set
尚未调用您的构造函数),因此您尝试操作/访问的内存entry[0].insert (23)
将导致未定义的行为.
将 C++ 对象与malloc
它的等价物混合通常(我很想写“总是”)被认为是不好的做法。
相反,转向operator new
哪个将分配内存并以适当的方式处理对象的构造,还要记住delete
分配的内存以将内存释放回系统(并使对象以真正的方式销毁)。
一些答案将包含说明您最好使用 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;
}
这是一个很好的问题,但它的答案并不是很明显。问题是每个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;
}
不要尝试将 malloc/calloc/realloc 等与 c++ 类一起使用。使用新的。