android - C++ - 继承 ostream 在 android 上崩溃但在 windows 上不崩溃

标签 android c++ windows io iostream

我已经实现了一个简单的 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 中声明 mBufmStream 的顺序:无论它们出现在构造函数初始化列表中的顺序。顺便说一句,在您的原始代码中将成员函数标记为 inline 是多余的:当您在类定义中定义一个成员函数时,它会自动标记为可内联。

这对您的系统来说是否是一个合理的设计取决于您打算如何使用这些类,但答案可能是“否”。

关于android - C++ - 继承 ostream 在 android 上崩溃但在 windows 上不崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9482368/

相关文章:

windows - Windows 驱动程序签名需要什么证书?

c# - 获取任务栏中所有窗口的句柄

java - 无法在 Android 手机和 PC 之间建立客户端服务器蓝牙串行连接

android - 如何将 JSON 数据存储到 Realm 中并将其显示到 recyclerview 中

java - 和Engine Box2D Body GetContactList

c++ - c++ 作用域左括号处的存储分配?

c++ - 用于执行 C++ 系统函数的用户定义目录

java - 如何在 Android 上运行普通的旧 java 应用程序

C++接口(interface)声明/定义和使用

c++ - Qt中如何检测Windows关机或注销