nullptr을 처리하지 않는 경우.class Player {
public:
int hp = 0;
};
Player* FindPlayer(int id) {
return nullptr;
}
void Test(Player* p) {
if (nullptr == p) {
return; // nullptr 체크 후 함수 종료.
}
p->hp = 10; // 안전한 접근.
}
int main() {
Player* p = FindPlayer(100); // FindPlayer는 nullptr 반환.
// p->hp = 100; // 여기서 크래시 발생 가능.
Test(nullptr); // 안전한 호출.
}
FindPlayer 함수:nullptr을 반환.nullptr을 반환하면, 포인터를 통해 객체에 접근하려고 하면 문제가 발생.Test 함수:nullptr인지 확인 후 안전한 경우에만 hp 값을 수정.nullptr 체크를 통해 문제를 예방.nullptr 체크 필수:nullptr 여부를 확인.std::unique_ptr 또는 std::shared_ptr을 사용해 포인터 관리.int main() {
short hp = 30000;
while (true) {
hp += 100; // 32767 초과 시 음수로 돌아감.
}
}
short 타입:short는 2바이트 크기(-32768~32767)를 가지며, 초과 시 오버플로우 발생.int, long)을 사용.std::numeric_limits로 범위를 초과하는지 확인.new 또는 malloc으로 할당된 메모리를 delete 또는 free로 해제하지 않음.class Item {
public:
Item() {}
~Item() {}
};
int main() {
while (true) {
Item* item = new Item(); // 동적 메모리 할당.
// delete item; // 해제 누락 시 메모리 릭 발생.
}
return 0;
}
new Item()으로 동적 메모리를 할당하지만, 해제(delete)하지 않아 점유된 메모리가 계속 증가.std::unique_ptr 또는 std::shared_ptr로 메모리 자동 관리._CrtDumpMemoryLeaks) 또는 Valgrind를 사용.class Player {};
class Dog {};
int main() {
Player* p = new Player();
Dog* dog = reinterpret_cast<Dog*>(p); // 위험한 캐스팅.
// dog-> 특정 멤버 접근 시 프로그램 충돌 가능.
}
reinterpret_cast 사용:Player*를 Dog*로 강제로 변환.int arr[100];
arr[101] = 50; // 초과된 인덱스 접근.
class Monster {
public:
int _hp = 100;
};
int main() {
Monster* m = new Monster();
delete m; // 메모리 해제.
m->_hp = 200; // Use-After-Free 발생.
}
nullptr로 초기화.NULL 크래시 해결:
nullptr 체크.정수 오버플로우 방지:
메모리 릭 방지:
메모리 오염 방지: