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
),但请注意,取消引用空指针的效果并不比取消引用未初始化指针的效果好(尽管错误消息可能有点小)