Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++专用指针“漏”?_C++_Memory Leaks_Pointers - Fatal编程技术网

C++专用指针“漏”?

C++专用指针“漏”?,c++,memory-leaks,pointers,C++,Memory Leaks,Pointers,我将创建一个类来保存将传递给函数的一长串参数。让我们用这个简短的例子: class ParamList{ public: ParamList(string& a_string); string& getString(); //returns my_string private: string& my_string; } 我的问题是:我的_字符串是私有的,但我返回对它的引用。这不是不是像C++中的私用指针泄露的东西?这不是好的编程实践吗?我希望g

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

class ParamList{

public:
    ParamList(string& a_string);
    string& getString(); //returns my_string
private:
    string& my_string;
}
我的问题是:我的_字符串是私有的,但我返回对它的引用。这不是不是像C++中的私用指针泄露的东西?这不是好的编程实践吗?我希望getString的调用者能够获取引用并对其进行修改

请让我知道

谢谢, jbu


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

首先,您需要确定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就可以稍微控制其成员的修改方式。

只要:

A.这是一个常量引用,并且您已经记录了该引用何时会失效或失效 B.该引用旨在修改,即std::vector::operator[]


虽然有返回非常量引用的有用案例,但通常应该避免使用它。第三版第28项中介绍了这一点:如果您想查看,请避免将句柄返回到对象内部。

将引用作为成员是一种可疑的做法,除非您确切知道自己在做什么。但是我在代码中没有看到任何指针。我不知道我在做什么。如果my_string是一个指针,而getString返回了一个指向字符串的指针怎么办?它仍然应该返回一个常量字符串*这更像是一个问题,这个类为什么存在?它根本不拥有string对象,那么为什么要传递这个类而不是实际的string对象呢?这只是包装的另一层。它甚至不分配字符串,只分配对字符串的引用,因此其他地方仍然必须拥有该字符串,或者在堆栈的更高位置(可能在另一个类中),或者在全局变量中。不管怎样,这个类为什么存在?@kevin:它存在每个参数对象都有一起的成员。参数对象列表被传递给函数。@Neil:从一个字符串复制到另一个字符串的缩写。标准库中函数的名称-混淆的可能性:高。@Neil:更不用说它像my_string=new_string一样简单。