为什么<char>我的重载流运算符上出现 std::basic_string 段错误?



我正试图在g++中编译并运行这个看起来无害的类,但程序在malloc或memmove上一直存在分段错误。这里几乎没有什么事发生。

使用-g编译并通过gdb运行时,我收到以下错误。这就是我所知道的关于如何调试它的范围。

由于某些原因,当从两个单独的文件编译时,这只是segfault。如果我将所有内容复制/粘贴到main.cpp中,它运行良好

Windows/Cygwin g++(GCC)4.9.2:

程序接收到信号SIGSEGV,分段故障。

来自/usr/bin/cygwin1.dll 的memmove()中的0x61137eb5

程序接收到信号SIGSEGV,分段故障。

muto::从/usr/bin/cygwin1.dll 获取(无符号长)()中的0x610ef417

Windows/g++4.9.2-TDM:

程序接收到信号SIGSEGV,分段故障。

ntdll中的0x777d27d0!来自/c/Windows/SysWOW64/ntdll.dll 的RtlCompareMemoryUlong()

程序接收到信号SIGSEGV,分段故障。来自/lib64/libc.so.6的_int_malloc()中的0x00007ffff7279ef5缺少单独的debuginfo,请使用:debuginfo install glibc-2.17-55.el7_.5.x86_64 libgcc-4.8.2-16.2.el7_x86_64-libstdc++-4.8.2-16.2.el7_x86_64..

CentOS 7/g++(GCC)4.8.2:

程序接收到信号SIGSEGV,分段故障。

_malloc.c:3281 处的int_malloc(av=0x7ffff75b6760,字节=29)

3281{

我使用以下标志进行编译:

-pedantic -Wall -Wextra -Wcast-align -Wcast-qual -Wctor-dtor-privacy -Wdisabled-optimization -Wformat=2 -Winit-self -Wlogical-op -Wmissing-declarations -Wmissing-include-dirs -Wnoexcept -Woverloaded-virtual -Wredundant-decls -Wshadow -Wsign-conversion -Wsign-promo -Wstrict-null-sentinel -Wstrict-overflow=5 -Wswitch-default -Wundef -Wno-unused

我错过了什么?在gdb中,我还能做些什么来帮助确定问题吗?

$ g++ main.cpp string_t.cpp -g -std=c++11 $DEBUG -o test.exe && ./test.exe

main.cpp

#include <iostream>
using std::cout;
using std::endl;
#include "string_t.h"
int main() {
   string_t a("test");
   cout << a << endl;
   return 0;
}

字符串.t.h

#include <cstdint>
#include <string>
class string_t {
std::basic_string<char> _base;
public:
   string_t(
      const char* s);
   friend std::ostream& operator<<(
      std::ostream& l,
      const string_t& r);
};

字符串.t.cpp

#include "string_t.h"
string_t::string_t(
   const char* s) :
   _base(s) {
}
std::ostream& operator<<(
   std::ostream& l,
   const string_t& r)
{
   l << r._base.c_str();
   return l;
}

您没有将<ostream>包含在第二个翻译单元(string_t.cpp)中,因此过载解析无法找到

template<class CharT, class Traits>
basic_ostream<CharT,Traits>& operator << (basic_ostream<CharT,Traits>& os, const char* s);

当您调用时

l << r._base.c_str();

相反,string_t(const char* s)被用作转换构造函数(它没有被声明为explicit)来创建一个新的string_t对象和

std::ostream& operator<<(std::ostream& l, const string_t& r)

再次调用,所以您最终会使用无限递归。

相关内容

  • 没有找到相关文章

最新更新