C++ 尝试将对象插入nullpointers数组时出现分段错误

C++ 尝试将对象插入nullpointers数组时出现分段错误,c++,segmentation-fault,C++,Segmentation Fault,这是我需要实现的类的一部分 template <class Element, class Compare = std::equal_to<Element>> class UniqueArray { Element** data; unsigned int size; unsigned int max_size; public: explicit UniqueArray(unsigned int size); UniqueArray(

这是我需要实现的类的一部分

template <class Element, class Compare = std::equal_to<Element>>
class UniqueArray {
    Element** data;
    unsigned int size;
    unsigned int max_size;
public:
    explicit UniqueArray(unsigned int size);
    UniqueArray(const UniqueArray& other);
    ~UniqueArray();
    unsigned int insert(const Element& element);
数据实际上是一个指针数组。
每个指针都指向一个元素

这是我对
insert
函数的实现,它会导致
SEGFAULT

template <class Element, class Compare>
unsigned int UniqueArray<Element, Compare>::insert(const Element& element){
    if (size >= max_size){
        throw UniqueArrayIsFullException();
    }
    for(int i = 0; i < size; i++){
        if((Compare(), *data[i]) == element){
            return i;
        }
    }

    *data[size++] = element;
    return size;
}
模板
无符号int UniqueArray::insert(常量元素和元素){
如果(尺寸>=最大尺寸){
抛出UniqueArrayFullException();
}
对于(int i=0;i
im运行的测试如下所示:

static void testInt() {
    typedef UniqueArray<int, std::equal_to<int>> intUA;
    // Test ctor
    unsigned int size = 4;
    intUA ua(size);
    assert(ua.getSize() == size);
    assert(ua.getCount() == 0);
    // Test insert
    ua.insert(4);
    unsigned int index = ua.insert(1);
    ua.insert(5);
    assert(ua.insert(1) == index);
    ua.insert(2);
    assert(ua.getCount() == 4);
    ua.insert(2);
    // Test UniqueArrayIsFullException
    try {
        ua.insert(3);
    }
    catch (intUA::UniqueArrayIsFullException& e) {
        return;
    }
    assert(0);
}
静态无效测试(){
typedef UniqueArray intUA;
//测试导体
无符号整数大小=4;
intUA ua(大小);
断言(ua.getSize()==size);
断言(ua.getCount()==0);
//测试插入
ua.插入(4);
无符号整数索引=ua.insert(1);
ua.插入(5);
断言(ua.insert(1)=索引);
ua.插入(2);
断言(ua.getCount()==4);
ua.插入(2);
//测试唯一性ArrayFullException
试一试{
ua.插入(3);
}
捕获(intUA::UniqueArrayIsFullException&e){
返回;
}
断言(0);
}

第一次调用
insert
时,测试失败,并指出问题出在第
*行数据[size++]=element中

要制作元素的副本并将其存储在
数据[size++]
中,请更改

    *data[size++] = element;


额外提示:以下内容可能无法按预期的方式工作:

    if((Compare(), *data[i]) == element)

但是您对它有一个很好的测试,所以它应该捕获它。

要复制元素并将其存储在
数据[size++]
中,请更改

    *data[size++] = element;


额外提示:以下内容可能无法按预期的方式工作:

    if((Compare(), *data[i]) == element)
但是您对它有一个很好的测试,所以它应该能够捕获它。

当您第一次构造
UniqueArray
, 不初始化数组中的任何指针

如果幸运的话,它们都是空指针

因此,第一次尝试通过插入元素时

*data[size++] = element;
数组项
data[size]
是空指针或未初始化指针。 当您评估
*数据[size]
时,您希望发生什么?

当您第一次构建
UniqueArray
, 不初始化数组中的任何指针

如果幸运的话,它们都是空指针

因此,第一次尝试通过插入元素时

*data[size++] = element;
数组项
data[size]
是空指针或未初始化指针。
当您评估
*数据[size]
时,您预期会发生什么?

什么是
(Compare(),*data[i])==element
?在循环之前创建函数对象,
Compare cmp
然后在循环中调用它:
如果(cmp(*data[i],element))
我不应该调用它的默认构造函数吗:
compare\u func=compare()如果需要,但
比较\u func较短。主要是如何使用它:
if(compare_func(arg1,arg2))
是正确的方法。您当前的代码无法工作。
(Compare(),*data[i])==element
应该做什么?在循环之前创建函数对象,
Compare cmp
然后在循环中调用它:
如果(cmp(*data[i],element))
我不应该调用它的默认构造函数吗:
compare\u func=compare()如果需要,但
比较\u func较短。主要是如何使用它:
if(compare_func(arg1,arg2))
是正确的方法。您当前的代码无法工作。至于分段错误,它现在正在工作:)关于
Compare()
,您是否建议我创建此对象的实例?例如,每当函数需要比较两个元素时:
compare\u func=compare()compare\u func(元素a,元素b)
Yes。像这样:
Compare-cmp。。。if(cmp(*data[i],element))…
if(Compare()(*data[i],element))…
我不应该通过调用它的默认构造函数:
Compare\u func=Compare()
,在
Compare-cmp自动调用默认构造函数。至于分段错误,它现在正在工作:)关于
Compare()
,您建议我创建此对象的实例吗?例如,每当函数需要比较两个元素时:
compare\u func=compare()compare\u func(元素a,元素b)
Yes。像这样:
Compare-cmp。。。if(cmp(*data[i],element))…
if(Compare()(*data[i],element))…
我不应该通过调用它的默认构造函数:
Compare\u func=Compare()
,在
Compare-cmp自动调用默认构造函数。如果我想将数组中的所有指针初始化为空指针,这段代码就足够了吗
for(int i=0;i
从一般良好实践的角度来看,我喜欢显式初始化(尽管
nullptr
现在是首选符号),但请注意,取消引用空指针并不比取消引用未初始化指针更好(虽然错误消息可能更容易识别)。您需要将指向实际对象的实际指针放入数组中。其他答案对此有一些想法。如果我想将数组中的所有指针初始化为空指针,这段代码就足够了?
for(int I=0;I
从一般良好实践的角度来看,我喜欢显式初始化(尽管现在首选的符号是
nullptr
),但请注意,取消引用空指针的效果并不比取消引用未初始化指针的效果好(尽管错误消息可能有点小)