C++ 생성자 호출 없이 메모리 할당하는 operator new 를 어떨때 사용 하시나요?

ikpil의 이미지

안녕하세요? More Effecvie C++ 에선 new 와 operator new 의 차이점에 대해서 충분히 설명을 해 주어, 어느정도 이해 했습니다만(어디에 쓸줄 모르니 모른다고 해야 정확 할듯 합니다.)

operator new 를 사용 할때는 크게 두가지로 나뉘는데
첫째, 생성자 호출 없이 메모리를 할당 받고 싶을 때
둘째, 원하는 지역에 메모리를 할당 받고 싶을 때
둘째의 경우에는 공유 메모리를 사용 할때나 메모리-맵 I/O를 사용하는 애플리케이션이 필요할때 사용 한다고 저자는 설명합니다.

둘째는 구글에서 많이 찾아봐서 어느정도 이해가 되었습니다.
하지만 첫째의 부분은 검색을 해도 잘 찾을수가 없어 질문을 올립니다.

질문
1. 생성자 호출이 없이 메모리 할당 받고 싶을때가 언제가 있을까요? (모호성을 피하고 싶을때만 사용 되어 지나요?)
2. 자신의 맡은 실무에서 평균적으로 생성자 필요없이 메모리 할당을 어느정도 하셨었나요?

Necromancer의 이미지

거꾸로 얘기하신건 아닌지.

new로 받으면 생성자 호출하고 malloc()으로 받으면 그냥 받기만 합니다.

첫째라면.. 네트웍 전송용 구조체 같은거 할당받고자 할때는 생성자 부를 필요 없으므로 new 안씁니다.
그외에도 문자열을 직접 조작할려고 char 배열을 받는 경우 등등이 되겠습니다.

물론 이런 상황에서 new를 쓸 수도 있습니다.
c++ 배우기 전에 c를 많이 쓴 사람이라면 새로나온 new 대신에 malloc()을 쓸려는 경향이 더 강합니다. 습관이라고 봐야죠.

Written By the Black Knight of Destruction

Written By the Black Knight of Destruction

ikpil의 이미지

네트워크에서 데이터 전송할땐 쓰는군요!

아참 그리고
operator new 와 new 는 차이가 있다고 배웠습니다.

new 는
1. operator new 로 메모리를 할당
2. 할당된 메모리에 객체를 초기화(생성자 호출)
3. 객체형으로 포인터 반환

operator new 는
1. 단순히 메모리 할당(생성자 호출 안함)
malloc()의 C++ 형태

추가적으로 메모리 지정 new 도 있습니다.
이것은 원하는 지역(메모리)에 원하는 객체의 크기(할당크기)만큼 할당해서 객체를 형세(생성자 호출로 그 지역 초기화)를 하게끔 해줍니다.

사용법은 new (pointer) 임시객체생성자 식으로

// 이때 buffer는 미초기화된 할당 받은 공간이여야 합니다.
int* pointerint(void *buffer, int var)
{
return new (buffer) int(var);
}

이렇게 사용 된다고 배웠습니다.

혹시 잘못 이해한 부분이 있다면, 지적 부탁드립니다.

Necromancer의 이미지

아... 그럼 제가 못 본 부분인거 같네요. new와 malloc()만 있는줄로 알았는데 더 알아봐야겠네요.

Written By the Black Knight of Destruction

Written By the Black Knight of Destruction

kaeri17의 이미지

메모리 공간만 필요하고 객체는 그냥 복사해서 가져다 놓는 거니까요...

STL의 경우 allocator라는 메모리 할당 객체가 따로 있긴 합니다만, 사용자 수준에서는 간단한 operator new를 써도 되죠.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.