我正在尝试将Node<K,V> (struct)
添加到数组(Class)中并使用lower_bound
对其进行排序。
在调试我的代码时,我意识到它已停止工作:
auto itr = std::lower_bound...
这是我的add
功能代码:
template<typename K, typename V>
bool MapSet<K,V>::add(Node<K,V> n){
if(find_key(n.first) != nullptr){
return false;
}
if(last_ == capacity_){
grow();
}
else{
Node<K,V> res;
res.first = n.first;
res.second = n.second;
Node<K,V>* newarr = new Node<K,V>[capacity_];
auto itr = std::lower_bound(ary_,ary_+last_,res);
size_t itrind = std::distance(ary_, find_key((*itr).first));
size_t newcount = 1;
for (size_t i = 0; i < itrind; i++) {
newarr[i] = ary_[i];
newcount++;
}
newarr[newcount] = res;
for (size_t i = newcount+1; i < capacity_; i++) {
newarr[i] = ary_[i];
}
delete [] ary_;
ary_ = newarr;
last_++;
return true;
}
}
这是find_key
功能代码:
template<typename K, typename V>
Node<K,V>* MapSet<K,V>::find_key(K key){
std::cout << "find func" << '\n';
for(size_t i=0; i < capacity_; i++){
if((ary_[i]).first == key){
Node<K,V>* lol = &ary_[i];
return lol;
}
else{
continue;
}
}
return nullptr;
}
和grow()
使数组的大小加倍。 Node<K,V>
有成员first(K)
和second(V)
,而类MapSet
有数组ary_
,这是一个Node数组,
last_ (size_t)
是数组的最后一个非空元素,capacity_ (size_t)
是数组的大小。
我的lower_bound
函数是否有问题,或者错误可能在其他地方?任何建议?谢谢!
编辑: 我也遇到了分段错误:
Node<K,V>* lol = &ary_[i];
编辑: 我修复了指出sizeof(ary_)和delete [] ary_的错误,但我仍然遇到了分段错误。
答案 0 :(得分:3)
这是一个主要问题:
ary_ = newarr;
delete [] newarr;
首先,让ary_
指向与newarr
指向相同的内存。您现在有两个指针指向 到同一个内存 。
然后释放两个指针都指向的内存。
如果您在此之后尝试取消引用ary_
,则会undefined behavior。
另一个问题是:
new Node<K,V>[sizeof(ary_)];
由于ary_
是指针(我假设,因为您没有向我们展示Minimal, Complete, and Verifiable Example),因此sizeof(ary_)
会为您提供指针而非指向的内容。
您可以通过停止使用指针和自己的手动内存管理轻松解决这两个问题,而是使用std::vector
。
答案 1 :(得分:1)
首先使用新操作符
Node<K,V>* newarr = new Node<K,V>[sizeof(ary_)];
错了。表达式sizeof(ary_)
等于指针的大小,通常为4或8个字节,具体取决于所使用的系统。
相对于for语句
中的条件存在同样的问题for(size_t i = newcount + 1; i < sizeof(ary_); i++)
^^^^^^^^^^^^^^^^
这些陈述
ary_ = newarr;
delete[] newarr;
有逻辑错误。
我认为你的意思是
delete [] ary_;
ary_ = newarr;
还不清楚为什么newcount
的初始值设置为1而不是0。
size_t newcount = 1;
for(size_t i = 0; i < itrind; i++)
{
newarr[i] = ary_[i];
newcount++;
}
newarr[newcount] = res;
此次电话
size_t itrind = std::distance(ary_, find_key((*itr).first));
可以调用未定义的行为。
完全不清楚函数grow
的作用。这使代码混乱。