代码之家  ›  专栏  ›  技术社区  ›  Tony The Lion

这会被认为是好的C++代码吗?

  •  1
  • Tony The Lion  · 技术社区  · 14 年前

    我有一个带有原始指针的向量(不,我不能使用智能指针),我想在for循环中将项添加到列表中。我做了一个小项目,我想知道这是否被认为是好的C++代码指针管理。

    请只考虑原始指针管理,对于我试图解决的这个特定问题,我对智能指针不感兴趣。

    一个简单的对象:

    class Request
    {
    public:
        std::string name;
    
    };
    
    std::vector<Request*> requests;
    
    for (int i = 0; i < 5; i++)
    {
        std::stringstream ss;
        ss << "elemenent ";
        ss << i;
    
        std::string s = ss.str();
    
        Request* req = new Request();   
        req->name = s;
    
        requests.push_back(req);
    
    }
    

    所以我要解决的问题是将DOMNode*添加到 this 图书馆。
    我开始觉得试图为我的项目从这个库中需要的部分编写一个包装器是个坏主意。或者图书馆不好?

    5 回复  |  直到 14 年前
        1
  •  5
  •   Björn Pollex    14 年前

    嗯,这会泄露内存,所以很糟糕。你能用一个 Pointer Container ?

    这段代码泄漏的原因是您使用 new delete 在他们身上。

    至于注释,如果有一个对象手动管理某些资源,则需要 The Big Three

        2
  •  0
  •   Matthieu M.    14 年前

    我认为在方法的末尾有一个循环,可以对 vector

    仍然存在一些问题,特别是例外安全问题。

    • 如果在 Request 矢量 ,你失去了记忆。一种解决方案是临时使用 scoped_ptr 为了留住记忆, push_back ptr.get() 然后打电话给 release 方法从现在起,内存归 .
    • 如果在创建 矢量 当你销毁它们的时候,你需要捕捉异常,销毁它们,然后重新抛出。

        3
  •  0
  •   Community CDub    8 年前

    如果不能使用智能指针,则使用 boost::ptr_vector

    请注意,如果您正在使用 TinyXml ,内存管理 XmlNode 可能是由库决定的-最近的历史iirc是,您的许多问题都与正确理解这个库的内存所有权和释放范例有关。

    What memory management do I need to cleanup when using TinyXml for C++?

    What is the best open XML parser for C++?

        4
  •  0
  •   Vijay Mathew Chor-ming Lung    14 年前

    template <class T>
    class MemManager
    {
    public:
      typedef std::vector<T*> Vec;
      ~MemManager ()
      {
        size_t sz = v_.size ();
        for (size_t i = 0; i < sz; ++i)
          delete v_[i];
      }
      T* pushNewObject () 
      {
        T* t = NULL;
        try
        {
            t = new T;
            if (t != NULL)
               v_.push_back(t);            
        }
        catch (std::bad_alloc& ex) { /* handle ex */ }
        return t;
      }
      const Vec& objects() const { return v_; }
    private:
      Vec v_;
    };
    
    // test
    {
      MemManager<Request> mm;
      for (int i = 0; i < 5; i++)
        {
          std::stringstream ss;
          ss << "elemenent ";
          ss << i;
    
          std::string s = ss.str();
    
          Request* req = mm.pushNewObject();
          req->name = s;    
        }
    } // all Request objects will be deleted here when 
      // the MemManager object goes out of scope.
    
        5
  •  -1
  •   ur.    14 年前

    一个快速的改进可以是派生一个类 RequestVector std::vector<Request*> ,添加 ClearRequests Request 对象并清除向量)并使其成为析构函数调用 清除请求 . 请求向量 可能是一个更好的选择,但是派生类完成得更快)。