C++ 클래스별 new/delete Override하는법?

jic5760의 이미지

안녕하세요.
C++ 에서 Class별로 new/delete 연산자를 Override하고싶습니다.

void* operator new(std::size_t size) throw(std::bad_alloc)
{
}
 
void operator delete(void *ptr) throw()
{
}
 
void* operator new[](std::size_t sz) throw(std::bad_alloc)
{
}
 
void operator delete[](void* p) throw()
{
}

우선 위같이 하면
A *pA = new A;
char *pB = new char[1024];
이런식으로 하면 원하는데로 작동합니다.

그런데 저는 Global영역이 아닌 특정 Class영역안에서 new/delete연산자 override을 하고 싶습니다.

class Allocator
{
	void* operator new(std::size_t size) throw(std::bad_alloc)
	{
	}
 
	void operator delete(void *ptr) throw()
	{
	}
 
	void* operator new[](std::size_t sz) throw(std::bad_alloc)
	{
	}
 
	void operator delete[](void* p) throw()
	{
	}
}
 
class Test : public Allocator
{
	void test(){
		A *pA = new A; // 클래스 할당
		char *pB = new char[1024];
	}
}

이런식으로 해 봤는데 이런식의 new/delete Override는 제가 원하는 방식으로 동작하지 않더라구요..
그냥 기본 new/delete으로 동작합니다.

제가 원하는것은 위처럼 Allocator class을 상속받으면 그 클래스 안에서 사용되는 모든 new/delete에 대해 Allocator의 함수가 실행되길 원합니다.

C++에서 이런석이 가능할까요?

익명 사용자의 이미지

static 멤버로 만드세요. c++ operator new 로 검색하면 금방 나오는데 굳이 질문하실 필요는 없었을 것 같네요.

jic5760의 이미지

static으로도 해봤는데 안되더라구요..ㅠㅠ
클래스 안에서 new연산자로 작동하는게 아니라 해당 클래스의 dynamic allocator으로만 작동했습니다...ㅠㅠ
Allocator *pAlloc = new Allocator;
이런식으로 new operator를 지정한 class만 그 class의 new operator을 탑니다.

익명 사용자의 이미지

원하시는게 무엇인지 잘 모르겠군요. 원하시는 바를 정확하게 말씀해주시는 것이 좋겠습니다.

jic5760의 이미지

C++에서 new/delete로 메모리할당을 하는 소스를 그대로 사용하면서 별도의 Memory Pool을 이용해서 메모리 관리를 하려고 합니다.
그런데 C++에서 이런건 원래 지원을 안하는건지.. 모르겠네요..

익명 사용자의 이미지

여전히 뭘 하고 싶으신 것인지 잘 모르겠습니다. 앞선 글들을 보면 단순히 custom memory pool 을 replacement new 를 사용해서 구현하겠다는 것이 아니고 뭔가 특수한 방식으로 메모리 풀을 사용하고 싶으신 것 같은데 그걸 구체적으로 알려주셔야지요.

jic5760의 이미지

전역영역에서 new을 replacement해버리면 모든 클래스나 전역영역에서 MemoryPool을 써야하는데.. 저는 특정 클래스에서만 기존의 new을 통해서 메모리할당을 하는것을 custom memory pool을 통해 메모리할당을 하게 하고 싶은겁니다.
이를 통해서 클래스별로 메모리 프로파일링을 하려고 합니다.

익명 사용자의 이미지

혹시 특정 클래스(C 라고 부릅시다)의 메소드나 생성자 안에서 new expression을 사용하면 그 때에만 특별히 정의된 new operator가 호출되도록 하고 싶으신 거라면 제가 아는 한 방법이 없습니다. (원하시는 것이 이것이 아니라면 무시하시구요.)

그게 가능하면 new의 의미가 애매해집니다. 소스 코드 레벨에서 정적으로 정해지는 것이 아니라 호출될 때마다 다른 new가 실행됩니다. 예를 들어 C의 메소드에서 vector를 new 로 동적 할당할 때에 vector가 호출하는 new와 다른 클래스의 메소드에서 new로 vector를 동적 할당할 때에 vector가 호출하는 new가 달라지니까요. C++은 그정도로 동적인 언어가 아닙니다. delete도 문제가 생기지요.
이게 가능하려면 C에서 new로 할당된 메모리는 반드시 C 안에서 delete되어야 합니다 (특별히 정의된 new에 맞춰서 특별히 정의된 delete가 호출되어야하니까요). 그런데 그렇지 않은 경우가 흔히 있겠지요.

jic5760의 이미지

처음 말씀하신 부분을 원했던게 맞습니다..^^
생각해보니 그렇게 구현하면 그런문제도 있겠네요.. 답변 감사합니다!^^

김범진의 이미지

::operator new 전역
class-name::operator new 클래스

https://learn.microsoft.com/ko-kr/cpp/cpp/new-and-delete-operators?view=msvc-170

감 오시죠?
원하는 걸 한 줄로 정확히 잘 적으셨는데 익명님은 왜 저리 못 알아들으시는지.

익명 사용자의 이미지

누가 누굴보고 못알아듣는다는 건지
아는만큼 보이는 법

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.