【问题标题】:std::istream subclass : delete the streambuf in destructorstd::istream 子类:删除析构函数中的流缓冲区
【发布时间】:2014-12-10 04:02:09
【问题描述】:

我正在编写一个 std::istream 子类,它使用自己的 std::stringbuf 子类

class decostream : public std::istream
{
public:
    decostream(std::istream * input)
        : std::istream(new decostreambuf(input))
        {
        }

    ~decostream() { delete rdbuf(); }
}

这有效吗?从 std::istream 文档中很难知道当 istream 被销毁时 streambuf 是否仍然有效。

【问题讨论】:

  • 有效吗?是的。狡猾?当然好。将 buf 改为 decostream 的成员。如果有任何东西删除或更改了关联的缓冲区,您将泄漏缓冲区(足够糟糕),并可能删除您不拥有/未分配堆的缓冲区(致命)。所有这一切都假设decostringstream 派生自streambuf,为什么这个名字令人困惑?
  • 我认为@user657267 是对的。至少这是建议here,来自这个答案stackoverflow.com/a/6490625/1133179
  • 对不起,名字混淆了,这是写简化示例时的错误。现已修复。
  • 如果我将 decostreambuf 作为 decostream 的成员变量,它将在我将其传递给 istream 构造函数之后构造,所以这很糟糕。我不能将空指针传递给 istream 构造函数,然后在构造函数主体中设置 streambuf:我必须传递一个有效的 streambuf 指针。

标签: c++ c++11 stream subclassing


【解决方案1】:
#include <istream>
#include <sstream>

class decostreambuf : public std::stringbuf {
public:
    decostreambuf(std::istream* input) {
        //...
    }
};

class decostream : public std::istream {
public:
    decostream(std::istream* input) : sb(input), std::istream(&sb) {
        //...
    }
private:
    decostreambuf sb;
};

【讨论】:

    猜你喜欢
    • 2020-10-24
    • 1970-01-01
    • 2020-04-06
    • 2013-01-11
    • 2023-03-05
    • 1970-01-01
    • 2018-06-28
    • 1970-01-01
    • 2020-10-18
    相关资源
    最近更新 更多