【问题标题】:C++ private pointer "leaking"?C ++私有指针“泄漏”?
【发布时间】:2010-04-12 21:52:48
【问题描述】:

我将创建一个类来保存将传递给函数的一长串参数。让我们用这个更短的例子:

class ParamList{

public:
    ParamList(string& a_string);
    string& getString(); //returns my_string
private:
    string& my_string;
}

我的问题是:my_string 是私有的,但我正在返回对它的引用。这不是在 C++ 中称为私有指针泄漏之类的东西吗?这不是很好的编程习惯吗?我希望 getString 的调用者能够获取引用并对其进行修改。

请告诉我。

谢谢, jbu

edit1:调用者将使用 getString() 并修改返回的字符串。

【问题讨论】:

  • 将引用作为成员是可疑的做法,除非您确切地知道自己在做什么。但我在这段代码中没有看到任何指针。
  • 好的。我不知道我在做什么。如果 my_string 是一个指针,而 getString 返回一个指向字符串的指针呢?
  • 它仍然应该返回一个const string*
  • 更多的是“为什么这个类存在?”的问题。它根本不“拥有”字符串对象,那么为什么要绕过这个类而不是 ACTUAL 字符串对象呢?它只是包装的另一层。它甚至不分配字符串,只是对字符串的引用,因此在其他地方仍然必须拥有该字符串,要么在堆栈的更高位置(可能在另一个类中),要么在全局变量中。不管怎样,为什么这个类存在?
  • @kevin:它存在每个参数对象都有一起去的成员。将参数对象的 LIST 传递给函数。

标签: c++ memory-leaks pointers


【解决方案1】:

返回私有引用是完全可以的,只要:

A.这是一个const 参考,您已经记录了该参考何时可以失效或
B. 该引用旨在被修改(即std::vector<T>::operator[]

虽然有一些有用的情况可以返回非常量引用,但您通常应该避免使用它。这在 Scott Meyers' Effective C++(第 3 版,第 28 条)中有所介绍:如果您想查看,请避免将“句柄”返回到对象内部。

【讨论】:

    【解决方案2】:

    首先,您需要决定 ParamList 是要拥有该字符串还是只是“了解它”。您使用string& my_string 编写它的方式意味着它只是对其他人的字符串有句柄。在这种情况下,对某些人来说修改字符串不是(大部分)问题,因为 ParamList 最初并不拥有它!

    如果您希望 ParamList 拥有参数的完整主副本(取决于您要解决的问题),请执行以下操作:

    class ParamList{
    
    public:
        ParamList(const string& a_string); // do a strcpy in here.
    
        const string& getString(); //returns my_string
        void setString(const string& new_string); //do a strcpy here too.
    private:
        string my_string;
    }
    

    请注意,使用 set 和 get 函数可能比返回非常量引用更好,这样 ParamList 可以更好地控制其成员的修改方式。

    【讨论】:

    • @Neil:“从一个字符串复制到另一个字符串”的简写。
    • 标准库中函数的名称 - 混淆的可能性:高。
    • @Neil:更不用说像my_string = new_string 这么简单。
    猜你喜欢
    • 1970-01-01
    • 2016-05-14
    • 2013-10-31
    • 2015-12-15
    • 2018-10-18
    • 2022-01-26
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多