튀김족발
공부 끄적이는 공간
튀김족발
전체 방문자
오늘
어제
  • 분류 전체보기 (33)
    • C++ (10)
    • DirectX (12)
    • Unreal (11)
    • Unity (0)
    • EASTL (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
튀김족발

공부 끄적이는 공간

C++

6. STL Placement new

2022. 12. 17. 11:14

C++ STL 중 vector에 값을 넣고 뺄때 push_back을 사용해서 넣는다. 이렇게 넣을때, vector 내부에서는 연결돼있는 배열에 값을 넣고 만약 그 크기가 다 차게 되면 더 많은 메모리를 재 할당하여 사용하게 된다.

 

만약, 여기서 값을 빼고 해제를 하고싶어 delete를 사용해서 중간에 있는 값을 해제하게 되면!?!???!
연결돼있는 배열에서 중간의 값이 빠지면서 메모리가 큰일 날것이다.(안해봐서 모르는데 위험해보이긴 한다. 맨 처음값이 배열의 크기를 담당하는데 연속되는 중간에 값이 없으니까)

 

간단히 알아보자

 

#include <stdio.h>
#include <stdlib.h>
#include <memory>

char buffer[1024];

class KTest
{
	unsigned int _iData;
public:
	KTest()
	{
		_iData = 0x12345678;
		printf("KTest()\r\n");
	}

	~KTest()
	{
		printf("~KTest()\r\n");
	}

private:
	int i = 3;
};

void main()
{
	KTest* p = nullptr;

	p = new KTest();
	p->~KTest();
}

이런식으로 내부구현을 보면 그 값을 delete를 해주는게 아닌, 소멸자만 호출해준다.

 

이렇게 까지는 알겠는데, 외부에서 메모리를 관리하고 있을때, 그 메모리 안에 넣을 경우는 어떻게 할까?

 

void main()
{
	KTest* p = nullptr;
    
	p = new (buffer) KTest();
	p->~KTest();
}

간단하게 placement new를 사용해서 넣게 된다.

이전에 알아본 new를 함수처럼 사용한다.

 

하지만 이 placement new는 new를 재정의하게 되면, 사용할 수 없는 문제가 있다 ㅠㅠ

 

#include <stdio.h>
#include <stdlib.h>
#include <memory>

char buffer[1024];

class KTest
{
	unsigned int _iData;
public:
	KTest()
	{
		_iData = 0x12345678;
		printf("KTest()\r\n");
	}

	~KTest()
	{
		printf("~KTest()\r\n");
	}

	void* operator new(size_t size)
	{
		printf("operator new size = %i\r\n", size);
		return malloc(size);
	}

private:
	int i = 3;
};

void main()
{
	KTest* p = nullptr;
	p = new (buffer) KTest();
	p->~KTest();
}

컴파일 에러가 날것이다.

이럴때는 new 재정의 함수에 저 버퍼와 같은 매개변수를 넣어주면 된다.

#include <stdio.h>
#include <stdlib.h>
#include <memory>

char buffer[1024];

class KTest
{
	unsigned int _iData;
public:
	KTest()
	{
		_iData = 0x12345678;
		printf("KTest()\r\n");
	}

	~KTest()
	{
		printf("~KTest()\r\n");
	}

	void* operator new(size_t size)
	{
		printf("operator new size = %i\r\n", size);
		return malloc(size);
	}
	
	void* operator new(size_t size, char* buffer)
	{
		printf("operator new size = %i\r\n", size);
		return malloc(size);
	}

private:
	int i = 3;
};

void main()
{
	KTest* p = nullptr;
	p = new (buffer) KTest();
	p->~KTest();
}

출력 :

operator new size = 8
KTest()
~KTest()

 

이러면 무리없이 작동 된다.

'C++' 카테고리의 다른 글

8. STL Custom Allocator  (0) 2023.02.07
7. CRTP, Static Plymophism and Rebind  (0) 2023.01.09
5. Operator Overloading03 operator new  (2) 2022.12.17
4. Operator Overloading Ostream  (0) 2022.12.14
3. Operator Overloading Function  (0) 2022.12.14
    'C++' 카테고리의 다른 글
    • 8. STL Custom Allocator
    • 7. CRTP, Static Plymophism and Rebind
    • 5. Operator Overloading03 operator new
    • 4. Operator Overloading Ostream
    튀김족발
    튀김족발

    티스토리툴바