결과를 예측해 보세요.
글쓴이: gilgil / 작성시간: 금, 2011/09/23 - 3:56오후
#include <iostream> #include <string> using namespace std; string foo1() { string s = "hello"; return s; } string foo2() { string s = " world"; return s; } int main() { const char* p1 = foo1().c_str(); const char* p2 = foo2().c_str(); cout << p1 << p2 << endl; return 0; }
Forums:
댕글링 포인터 인가요?
댕글링 포인터 인가요?
======== 서명 =======
주거지는 www.indidev.net 입니다.
음...
이런 걸 dangling이라고 하나요? 음... 잘 모르겠네요. ^^
답은 여기에 : http://www.gilgil.net/9690
www.gilgil.net
함수내에서 선언된 객체의 리턴값을 받아서 메쏘드에
함수내에서 선언된 객체의 리턴값을 받아서
메쏘드에 접근을 하지만, 이미 객체는 해제되어 버렸으니까
댕글링 포인터 맞는것 같은데요?
======== 서명 =======
주거지는 www.indidev.net 입니다.
아,
dangling pointer는 delete된 객체를 가리키는 포인터만 얘기하는 줄 알았는데, 제가 잘못 알고 있었네요. ^^
http://en.wikipedia.org/wiki/Dangling_pointer
www.gilgil.net
컴파일러나, 관련 라이브러리나 OS 마다 결과가
컴파일러나, 관련 라이브러리나 OS 마다 결과가 다를거같은데..
네,
VC++ 랑 g++ 이랑 다릅니다.
객체는 stack으로 반환이 되고, p1 / p2가 가리키고 있는 포인터는 이미 메모리 해제(stack 해제) 상태이므로 결과는 환경마다 달라 지게 됩니다. ^^
www.gilgil.net
요즘 kldp에서 포인터가 가르키고 있는 값이
요즘 kldp에서
포인터가 가르키고 있는 값이 소멸되었을때
그 포인터를 사용하면 어떻게 동작하는지 물어보는게 유행인가요?
메쏘드(c_str)에 접근할 때까지는 살아 있지만
메쏘드(c_str)에 접근할 때까지는 살아 있지만 할당 선언문이 끝나면
리턴된 임시 string객체가 사라져 dangling pointer가 되겠네요.
Signature :) - "여유를 갖고 행동하되 게을러지지 말자"