1 분 소요

1. empty class

  • non static 멤버 데이터가 없는 클래스
#include <iostream> 
using namespace std; 
  
struct AAA 
{ 
}; 
int main() 
{ 
  AAA aaa; 
    
  cout << sizeof(AAA) << endl; // 1 Empty 클래스의 크기는 1바이트
}

2. std::nothrow

  • 메모리 할당 실패 시 예외(std::bad_alloc) 전달
  • empty class type으로 throwing 과 non-throwing 할당 함수의 overloads를 명확히 하는 데 사용
#include <iostream> 

using namespace std; 
  
// new : 메모리 할당 실패 시 예외(std::bad_alloc) 전달 
void* operator new(size_t sz) 
{ 
  void* p = malloc(sz); 
  if (p == nullptr) 
    throw std::bad_alloc(); 
  return p; 
} 
  
// 오버로딩만을 위한 타입이 필요할 때 empty 많이 사용
struct xnothrow_t {}; 
xnothrow_t xnothrow; 
  
//실패 시 0을 반환하는 버전 
void* operator new(size_t sz, xnothrow_t) 
{ 
  void* p = malloc(sz); 
  return p; 
} 
  
int main() 
{ 
  int* p1 = new(xnothrow) int; // 실패시 0 반환 

  if (p1 == nullptr) {}
  else 
    delete p1; 
}
#include <iostream>
#include <new>
 
int main()
{
  try {
    while (true) {
      new int[100000000ul];   // throwing overload
    }
  } catch (const std::bad_alloc& e) {
    std::cout << e.what() << '\n';
  }

  while (true) {
    int* p = new(std::nothrow) int[100000000ul]; // non-throwing overload
    if (p == nullptr) {
      std::cout << "Allocation returned nullptr\n";
      break;
    }
  }
}

참고

codenuri 강석민 강사 강의 내용기반으로 정리한 내용입니다.
코드누리
cppreference


This is personal diary for study documents.
Please comment if I'm wrong or missing something else 😄. 

Top

태그: , ,

카테고리:

업데이트:

댓글남기기