C++ 将引用传递给变量

C++ 将引用传递给变量,c++,mfc,C++,Mfc,我得到一个错误围绕变量dlgFile的堆栈已损坏,我正在尝试修复该错误。这是遗留代码,看起来可疑。我替换了另一个项目中的一部分,如下所示: void CPlantDlg::OnBnClickedButtonTestReference() { CString str = _T("Hello string"); { // intentional so destructor of Tester is called below Tester tester( str );

我得到一个错误
围绕变量dlgFile的堆栈已损坏
,我正在尝试修复该错误。这是遗留代码,看起来可疑。我替换了另一个项目中的一部分,如下所示:

void CPlantDlg::OnBnClickedButtonTestReference()
{
    CString str = _T("Hello string");

    { // intentional so destructor of Tester is called below
        Tester tester( str );
    }

    AfxMessageBox (str );
}
测试仪类别为:

class Tester
{
public:
    Tester(CString & str);
    ~Tester(void);

    CString _str;
};

Tester::Tester(CString & str) : _str( str )
{

}

Tester::~Tester(void)
{
    //_str = "Changed"; // say I do this, what will be printed in caller function?
}
这样通过CString安全吗?我认为
Tester
类应该销毁它的
\u str
,这会导致在类之外销毁原始str吗

当我运行它时,它会提示“Hello String”


如果启用
\u str=“Changed”
您希望提示什么?它实际上仍然显示原始字符串。它是通过引用传递的,为什么会这样?

Tester类中的_str变量是CString对象的实例。当成员初始值设定项说

_str( str )

它没有存储对传递给构造函数的CString引用的引用,正在调用copy构造函数,并且使用与str相同的值初始化_str。它只是一个副本。因此,更改它不会对原始CString产生影响。

Tester类中的_str变量是CString对象的实例。当成员初始值设定项说

_str( str )

它没有存储对传递给构造函数的CString引用的引用,正在调用copy构造函数,并且使用与str相同的值初始化_str。它只是一个副本。因此,更改它不会对原始CString产生影响。

Tester类中的_str变量是CString对象的实例。当成员初始值设定项说

_str( str )

它没有存储对传递给构造函数的CString引用的引用,正在调用copy构造函数,并且使用与str相同的值初始化_str。它只是一个副本。因此,更改它不会对原始CString产生影响。

Tester类中的_str变量是CString对象的实例。当成员初始值设定项说

_str( str )

它没有存储对传递给构造函数的CString引用的引用,正在调用copy构造函数,并且使用与str相同的值初始化_str。它只是一个副本。因此,更改它不会对原始CString产生影响。

请显示Tester类的声明。由于
Tester::\u str
将是构造函数收到的任何内容的副本,因此应使用“Hello string”。我在发布的代码中没有看到任何解释内存损坏错误的内容。它通过引用传递给函数,但随后会复制到
\u str
您提到的两个独立问题。您尚未发布任何引用名为
dlgFile
的变量的代码,因此我们甚至无法开始帮助您解决第一个问题。您的第二个问题已经得到了正确的回答,但是您不应该使用析构函数来设置您计划稍后访问的对象成员变量的值。此时对象将被销毁,您将无法再访问该成员变量。CString将自动进行引用计数,因此将其作为引用传递不会获得任何结果。不过,如果出于某种原因,您确实希望将其作为引用传递,那么在这种情况下,它应该是常量引用。请显示Tester类的声明。由于
Tester::\u str
将是构造函数接收到的任何内容的副本,因此“Hello string”是预期的。我在发布的代码中没有看到任何解释内存损坏错误的内容。它通过引用传递给函数,但随后会复制到
\u str
您提到的两个独立问题。您尚未发布任何引用名为
dlgFile
的变量的代码,因此我们甚至无法开始帮助您解决第一个问题。您的第二个问题已经得到了正确的回答,但是您不应该使用析构函数来设置您计划稍后访问的对象成员变量的值。此时对象将被销毁,您将无法再访问该成员变量。CString将自动进行引用计数,因此将其作为引用传递不会获得任何结果。不过,如果出于某种原因,您确实希望将其作为引用传递,那么在这种情况下,它应该是常量引用。请显示Tester类的声明。由于
Tester::\u str
将是构造函数接收到的任何内容的副本,因此“Hello string”是预期的。我在发布的代码中没有看到任何解释内存损坏错误的内容。它通过引用传递给函数,但随后会复制到
\u str
您提到的两个独立问题。您尚未发布任何引用名为
dlgFile
的变量的代码,因此我们甚至无法开始帮助您解决第一个问题。您的第二个问题已经得到了正确的回答,但是您不应该使用析构函数来设置您计划稍后访问的对象成员变量的值。此时对象将被销毁,您将无法再访问该成员变量。CString将自动进行引用计数,因此将其作为引用传递不会获得任何结果。不过,如果出于某种原因,您确实希望将其作为引用传递,那么在这种情况下,它应该是常量引用。请显示Tester类的声明。由于
Tester::\u str
将是构造函数接收到的任何内容的副本,因此“Hello string”是预期的。我在发布的代码中没有看到任何解释内存损坏错误的内容。它通过引用传递给函数,但随后会复制到
\u str
您提到的两个独立问题。您尚未发布任何引用名为
dlgFile
的变量的代码,因此我们甚至无法开始帮助您解决第一个问题。您的第二个问题已经得到了正确的回答,但是您不应该使用析构函数来设置您计划使用的对象成员变量的值