gpt4 book ai didi

c++ - vector 上的段错误

转载 作者:IT王子 更新时间:2023-10-29 00:31:24 26 4
gpt4 key购买 nike

我创建了一个结构来保存一些数据,然后声明了一个 vector 来保存该结构。

但是当我执行 push_back 时,我会遇到该死的段错误,我不知道为什么!

我的结构定义为:

typedef struct Group
{
int codigo;
string name;
int deleted;
int printers;
int subpage;

/*included this when it started segfaulting*/
Group(){ name.reserve(MAX_PRODUCT_LONG_NAME); }
~Group(){ name.clear(); }
Group(const Group &b)
{
codigo = b.codigo;
name = b.name;
deleted = b.deleted;
printers = b.printers;
subpage = b.subpage;
}
/*end of new stuff*/
};

最初,该结构没有拷贝、构造函数或析构函数。我后来在阅读下面这篇文章时添加了它们。

Seg fault after is item pushed onto STL container

但最终结果是一样的。

有一个让我非常困扰!当我第一次将一些数据插入 vector 时,一切正常。稍后在代码中,当我尝试将更多数据推送到 vector 中时,我的应用程序出现了段错误!

声明 vector

vector<Group> Groups

并且是我正在使用它的文件的全局变量。其他任何地方都没有外部人员,等等......

我可以将错误追踪到:

_M_deallocate(this->_M_impl._M_start, this->_M_impl._M_end_of_storage- this->_M_impl._M_start);

在 vector.tcc 中,当我完成将最后一个元素添加/复制到 vector 时....

据我所知。我不应该需要与复制构造函数有任何关系,因为浅拷贝应该足够了。我什至没有分配任何空间(但我为要试用的字符串保留了空间)。

我不知道是什么问题!

我使用 gcc 4.1.2 在 OpenSuse 10.2 上运行这段代码

由于向后兼容性问题,我并不是真的急于升级 gcc...

此代码在我的 Windows 机器上“完美”运行。我用 gcc 3.4.5 mingw 编译它没有任何问题......

帮助!

--- ... ---

:::编辑:::

我推送数据

Group tmp_grp;

(...)

tmp_grp.name = "Nova ";
tmp_grp.codigo=GetGroupnextcode();
tmp_grp.deleted=0;
tmp_grp.printers=0;
tmp_grp.subpage=0;
Groups.push_back(tmp_grp);

最佳答案

正如 Neil 所说,您不需要默认构造函数、复制构造函数或析构函数:

  • std::string自行清理,因此永远不需要析构函数。
  • 编译器提供的浅拷贝构造函数可以正常工作。
  • std::string::reserve是不必要的,因为 std::string将根据需要动态分配内存,但它可能提供性能优势。

您发布的代码看起来是正确的(而且它看起来非常简单明了,所以很难看出哪里可能会出现错误)。因此,我怀疑您正在破坏代码中其他地方的内存并且 vector<Group>简直就是受害者。

尝试安装 Valgrind (OpenSuse 应该为它提供一个包)并通过它运行您的应用程序(从命令行,只需运行 valgrind my-app )以查看 Valgrind 是否可以捕获任何内存损坏。

关于c++ - vector<struct> 上的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2739354/

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