class foo {
void hello(void) {
cout << "hello" << endl;
}
}
이렇게 정의 해 놓은 상태에서
int main() {
foo *bar = NULL;
bar->hello();
}
이렇게 작성해서 실행하면, 보기에는 실행이 안 될 것 같지만 실행이 된다.
- 인스턴스는 NULL를 가리키지만, 실제로 실행될 때는 hello 함수만을 호출하기 때문이다. (문장 설명이 부족한데?)
- stack이나 heap에서 데이터를 free 할 때, 실제로 포인터만 이동이 된다. 그래서 실제로는 데이터가 메모리에 남아있게 된다(기존의 값을 초기화화 할 필요없이 할당 플래그만 해제하면 되므로). 중간에 다른 곳에서 호출이 될 경우에 데이터가 덮어 써지는 문제가 발생할 수 있으므로, dangling pointer를 조심해야 한다.
- 이 이야기는 os의 가용 메모리 풀과 상관이 있군 - 서지혜
- ostringstream -> stream에 뭔가 하면 string으로 나온다
- 가변 인수 void NAME (int name, …)
'…'은 가변 인수를 표현한 것이다.
void Func(int 고정인자, …) {
va_list ap;
va_start(ap, 고정인자);
va_arg(ap, 인수타입); -> 가변 인수를 읽는 명령
va_end(ap);
}
- 형은 보장하지 않는다. 가변인자들의 형을 강제할 수 없기 때문에 stack에 void*로 저장된다. 그리고 최소한 인자가 하나는 있어야 한다.
- printf는 어떻게 인자들의 형을 관리하지? - 서지혜
- printf의 경우에는 첫째인자로 형을 판단할수 있기 때문에 문제가 되지 않죠. 하지만 같은 이유에서인지 printf("%f", 3) 을 잘못출력하는 문제가 있습니다. 이 취약점을 이용한 해킹 방법도 존재하지요. - 안혁준
- 첫번째 인자 안에 %d.. 등으로 가변인자의 형을 검사하는거야? - 서지혜
- 정답! 첫번째 인자에 이미 형에대한 정보를 넘겨 주기 때문에 가변인자라도 대쳐가 가능합니다.
예시 코드
#include <iostream>
#include <cstdarg>
using namespace std;
void test(int num, ...) {
va_list ap;
va_start(ap, num);
for(int i=0; i<num; i++) {
cout << va_arg(ap, int) << endl;
}
va_end(ap);
}
int main(void) {
test(5, 1,2,3,4,5);
return 0;
}
- stl vector를 이용한 class vector 만들기
- namespace로 같은 이름을 가진 클래스들을 사용해보자
- template과 friend
- template와 friend 사이에 여러 매핑이 존재한다. many to many, one to many, many to one, one to one : 참고(http://publib.boulder.ibm.com/infocenter/comphelp/v7v91/index.jsp?topic=%2Fcom.ibm.vacpp7a.doc%2Flanguage%2Fref%2Fclrc16friends_and_templates.htm)
- c++11에서 auto의 의미가 달라졌다??