我已经实现了一个简单的 ostream 和 streambuf 类。出于某种原因,当我尝试实例化我的 AndroidLogOStream 对象时它崩溃了。
注意:我的 Application.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;
};
它是准系统,在 Windows 上运行良好。它在 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;
}
虽然我对 iostream 仍然很困惑,但它一定是构造函数有问题,我想它是无效的?
最佳答案
在构造函数中,首先初始化基类,然后是所有成员。当您调用基类构造函数 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
是多余的:当您在类定义中定义一个成员函数时,它会自动标记为可内联。
这对您的系统来说是否是一个合理的设计取决于您打算如何使用这些类,但答案可能是“否”。
关于android - C++ - 继承 ostream 在 android 上崩溃但在 windows 上不崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9482368/