gpt4 book ai didi

c++ - std::sort with personal 类返回段错误

转载 作者:行者123 更新时间:2023-11-28 00:06:44 25 4
gpt4 key购买 nike

我对 std::sort 有一个小问题。

当我尝试使用 std::sort 覆盖“<”函数对分配的对象数组进行排序时,出现段错误。

您可以在下面的玩具示例中看到问题:在我的 class point 中,我分配了一个个人对象数组 key(特别是我为一个数组 v)。它的元素被初始化,然后我尝试对这个数组进行排序。

对于小尺寸(对于数组 v 和要排序的数组),我没有得到任何错误,并且 valgrind 不返回任何内容。对于大尺寸,我会遇到段错误,而 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;
}

最佳答案

您的类需要复制构造函数(或移动构造函数)和自定义赋值运算符,因为它们管理原始指针(资源)。否则,当 std::sort 执行您的 pointkey 对象的赋值时,相应对象的数据不会被深度复制,而只会复制指针被复制。然后,您的析构函数最终会为指向相同内存地址的指针释放内存,这会导致未定义的行为(您通常会在 Linux/Unix 上遇到段错误)。此外,删除那些 malloc/free 并将它们替换为 new[]/delete[]。或者更好,使用像 std::vector 这样的标准容器.

请注意,某些编译器可以在编译时捕获此问题。例如,带有 -Weffc++ 的 gcc 发出警告:

warning: struct Foo has pointer data members [-Weffc++] but does not override Foo(const Foo&)

关于c++ - std::sort with personal 类返回段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35281726/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com