결과를 예측해 보세요.

gilgil의 이미지

#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;
}

kippler의 이미지

댕글링 포인터 인가요?

======== 서명 =======
주거지는 www.indidev.net 입니다.

gilgil의 이미지

이런 걸 dangling이라고 하나요? 음... 잘 모르겠네요. ^^

답은 여기에 : http://www.gilgil.net/9690

kippler의 이미지

함수내에서 선언된 객체의 리턴값을 받아서
메쏘드에 접근을 하지만, 이미 객체는 해제되어 버렸으니까
댕글링 포인터 맞는것 같은데요?

======== 서명 =======
주거지는 www.indidev.net 입니다.

gilgil의 이미지

dangling pointer는 delete된 객체를 가리키는 포인터만 얘기하는 줄 알았는데, 제가 잘못 알고 있었네요. ^^

http://en.wikipedia.org/wiki/Dangling_pointer

익명 사용자의 이미지

컴파일러나, 관련 라이브러리나 OS 마다 결과가 다를거같은데..

gilgil의 이미지

VC++ 랑 g++ 이랑 다릅니다.

객체는 stack으로 반환이 되고, p1 / p2가 가리키고 있는 포인터는 이미 메모리 해제(stack 해제) 상태이므로 결과는 환경마다 달라 지게 됩니다. ^^

익명 사용자의 이미지

요즘 kldp에서
포인터가 가르키고 있는 값이 소멸되었을때
그 포인터를 사용하면 어떻게 동작하는지 물어보는게 유행인가요?

yhsuk의 이미지

메쏘드(c_str)에 접근할 때까지는 살아 있지만 할당 선언문이 끝나면
리턴된 임시 string객체가 사라져 dangling pointer가 되겠네요.

Signature :) - "여유를 갖고 행동하되 게을러지지 말자"