C++继承的ostream在android上崩溃,但在windows上没有
C++ - inheriting ostream crashes on android but not windows
我实现了一个简单的ostream和streambuf类。出于某种原因,当我尝试实例化AndroidLogOStream对象时,它会崩溃。
注意:我的应用程序.mk 中有stlport_static
class AndroidLogStreamBuf : public std::streambuf
{
public:
inline AndroidLogStreamBuf() : std::streambuf()
{
//std::cout << "asdfg";
}
inline ~AndroidLogStreamBuf()
{
}
};
class AndroidLogOStream : public std::ostream
{
public:
inline AndroidLogOStream() : std::ostream(&mBuf)
{
}
inline ~AndroidLogOStream()
{
}
private:
AndroidLogStreamBuf mBuf;
};
它光秃秃的,在窗户上运行良好。它在android上编译得很好,但由于某种原因崩溃了。它尝试执行的最后一行是_streambuf.c:46:
template <class _CharT, class _Traits>
locale
basic_streambuf<_CharT, _Traits>::pubimbue(const locale& __loc) {
this->imbue(__loc); <---- crash
locale __tmp = _M_locale;
_M_locale = __loc;
return __tmp;
}
当然,我对iostreams仍然很困惑,但它一定是构造函数出了问题,我想它是无效的?
在构造函数中,基类首先初始化,然后初始化所有成员。当您调用基类构造函数std::ostream
时,您正在向它传递尚未构造的mBuf
的地址。访问尚未构造的对象具有未定义的行为。
为了解决这个问题,你可以重新设计你的类如下:
class AndroidLogStreamBuf : public std::streambuf
{
public:
AndroidLogStreamBuf() : std::streambuf()
{ }
~AndroidLogStreamBuf()
{ }
};
class AndroidLogOStream : public std::ostream
{
public:
AndroidLogOStream(AndroidLogStreamBuf *buf) :
std::ostream(buf),
mBuf(buf)
{ }
~AndroidLogOStream()
{ }
private:
AndroidLogStreamBuf *mBuf;
};
class AndroidLogOStreamWithBuf
{
private:
AndroidLogStreamBuf mBuf;
AndroidLogOStream mStream;
public:
AndroidLogOStreamWithBuf() :
mBuf(&mStream),
mStream()
{ }
virtual ~AndroidLogOStreamWithBuf()
{ }
AndroidLogOStream& getOStream()
{
return mStream;
}
};
注意我在AndroidLogOStreamWithBuf
中声明的mBuf
和mStream
的顺序:这两个字段将按该顺序初始化,而不管它们在构造函数初始值设定项列表中的出现顺序如何。顺便说一句,在原始代码中将成员函数标记为inline
是多余的:当您在类定义中定义成员函数时,它会自动标记为可内联。
对于您的系统来说,这是否是一个合理的设计取决于您打算如何使用这些类,但答案可能是"否"。
正如前面所指出的,基类是首先构造的,从外观上看,基类构造函数似乎做了一些事情。我不认为这是故意的,但基类析构函数也会产生问题,这将在流缓冲区上调用pubsync()
。
当然,这解释了问题,但并没有提供解决方案:这个初始化问题的解决方案是使流缓冲区(或包含流缓冲区作为成员的自定义类)成为virtual
基类:
class oandroidligstream:
virtual AndroidLogStream,
public std::ostringstream {
...
}
};
基必须是虚拟的原因是流缓冲器是虚拟基CCD_ 9的自变量。为了确保流缓冲区首先初始化,它必须是最左边的虚拟基础。
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 分段 Linux Ubuntu 中的 g++ 错误,但在 Windows 中的 g++/MingW 中,在 C++ 中打
- Makefile在Linux中工作,但在Windows下不起作用,在子目录中找不到文件
- C++代码在 Linux 上按预期工作,但在 Windows 上则不然
- 简单的文本文件格式化在linux下崩溃,但在Windows中很好
- 在Windows 7下可以从C#调用C DLL,但在Windows 10下失败
- 唯一的字符代码在 Linux 中运行时不起作用,但在 Windows (C++) 中很好
- Simplecrypt让我的QT应用程序在OS X Mountain Lion上崩溃,但在Windows上完美运行
- BLAS 替换会导致 Linux 中的矩阵乘法失败,但在 Windows 中则不然
- C++:std::async 和 std::mutex 会导致 Linux 上的死锁,但在 Windows 上运行
- 未初始化的值在 Linux 上的行为符合预期,但在 Windows 上则不然
- 代码在Linux上运行良好,但在Windows操作系统上给出不同的输出
- .NET 4.0在XP上出现未知异常,但在Windows 7上运行良好
- C++使用*i指针打开文件,在Linux中覆盖,但在Windows中不覆盖
- C++继承的ostream在android上崩溃,但在windows上没有
- <random> 在 Linux 中生成相同的数字,但在 Windows 中不生成
- IoVolumeDeviceToDosName在Windows 7上崩溃,但在Windows XP上工作正常
- OpenGL glGetUniformLocation for Sampler2D在树莓派上返回-1,但在Windows
- c ++程序无法在Mac上正常运行,但在Windows上可以