【发布时间】:2018-03-10 19:31:31
【问题描述】:
我预计以下代码会失败(在main 函数中),但它可以工作:
class Response {
public:
Response() {}
void displayInfo() {
cout << "Hello!" << endl;
}
};
class HttpClient
{
public:
HttpClient(Response& response) : m_response(&response) {
m_response = &response;
}
Response* getResponse() {
return m_response;
}
private:
Response *m_response;
};
HttpClient* createClient()
{
Response response;
HttpClient *clnt = new HttpClient(response);
clnt->getResponse()->displayInfo();
return clnt;
}
int main()
{
HttpClient* client = createClient();
// ------------------------------------------
// I expect getResponse()->displayInfo() to fail, since "response" object
// passed as argument to HttpClient (in createClient function) goes out of the scope and should be deleted.
client->getResponse()->displayInfo();
}
所以我在createClient 函数中创建了局部变量response。
然后这个局部变量作为构造函数参数(引用)传递给 HttpClient。
这个参数被分配给成员Response *m_response。
据我了解,m_response 持有对 response 局部变量的引用。
但是当response局部变量超出范围时,我仍然可以通过m_response访问它(m_response对象的调用方法)。
我希望m_response 应该引用一些垃圾,因为response 超出了范围。
为什么会起作用?
【问题讨论】:
-
未定义行为未定义:P
-
未定义的行为总是按预期工作。
-
C++ 将确保您的代码正确的大量负担交给您(程序员) - 没有自动检查(原始)指针所指的内存是否仍然包含有效对象
-
@nullqube 你在说什么?这里不涉及引用计数,
createClient中使用的Response对象显然超出了范围 -
是的,我是对的,看看这个:stackoverflow.com/questions/3097593/…
标签: c++ pointers reference pass-by-reference