std::sort
我遇到了一个小问题。
当我尝试使用"<"的覆盖来对分配的对象数组进行排序时函数std::sort
,我得到了一个分段错误。
您可以在下面的玩具示例中看到问题:在我的class point
中,我分配了一系列个人对象key
(特别是我为数组v
分配了内存) 。它的元素被初始化,然后我尝试对这个数组进行排序。
对于小尺寸(对于数组v
和要排序的数组),我没有得到任何错误,而valgrind则返回none。
对于大尺寸,我会遇到分段错误,而valgrind会输出很多我不理解的错误。
你能帮帮我吗?
谢谢!
using namespace std;
#include <stdlib.h>
#include <iostream>
#include <algorithm>
class key
{
public :
int size;
double *v, f;
key() {}
key(const key & k)
{
size = k.size;
f = k.f;
v = (double*)malloc(size*sizeof(double));
for(int i=0;i<size;i++)
v[i]=k.v[i];
}
~key()
{
free(v);
}
bool operator<(const key& other) const
{
return f<other.f;
}
void init(int s)
{
size = s;
v = (double*)malloc(size*sizeof(double));
for(int i=0;i<size;i++)
v[i]=((double)rand()/(RAND_MAX));
}
};
class point
{
public :
key *k;
point() {}
point(int param1, int param2)
{
k = (key*)malloc(param1*sizeof(key));
for(int i=0;i<param1;i++)
{
k[i].init(param2);
k[i].f=param1-i;
}
std::sort(k,k+param1);
free(k);
}
};
int main(int argc, char **argv)
{
point p(100,21200); // segmentation fault!
//point p(10,2); // no segmentation fault!
return 0;
}
答案 0 :(得分:3)
您的类需要复制构造函数(或移动构造函数)和自定义赋值运算符,因为它们管理原始指针(资源)。否则,当std::sort
执行point
或key
个对象的分配时,相应对象的数据不会被深度复制,只会复制指针。然后,析构函数最终释放内存以指向指向相同内存地址的指针,从而导致未定义的行为(您通常会在Linux / Unix上遇到段错误)。另外,删除malloc/free
个new[]/delete[]
并将其替换为-Weffc++
。或者更好,使用标准容器,如std::vector
。
请注意,某些编译器可以在编译时捕获此问题。例如,带有struct Foo
的gcc会发出警告:
警告:
Foo(const Foo&)
有指针数据成员[-Weffc ++] 但不会覆盖<script> function copy() { try { $('#link').select(); document.execCommand('copy'); } catch(e) { alert(e); } } </script>