malloc 과 new 의 차이

girneter의 이미지

c++ 플그림을 만들고 있는데요.

new/delete 를 쓰는게 malloc/free 을 쓰는것보다 더
좋은 점이 뭘까요?

cedar의 이미지

new는 객체의 생성자를 자동으로 호출하고
delete는 소멸자를 자동으로 호출합니다.

C++ 객체에 malloc/free를 사용하면 객체가 제대로 생성/소멸되지 않으므로
런타임 에러를 유발하게 됩니다. 절대 사용하지 마세요.

girneter의 이미지

그런 결정적인 차이가 있네요.
감사합니다.

근데 제가 물어보고 싶었던건
클래스의 인스턴스를 만들때가 아니구요,
일반 구조체의 경우이거든요.

일반 구조체의 경우에는 차이가 없나요?

개념없는 초딩들은 좋은 말로 할때 DC나 웃대가서 놀아라. 응?

mrchu의 이미지

역시 new/delete를 사용하시는게 좋을것 같습니다.
Mayer의 Effective시리즈 책이 이 부분에 대해서는 아주 좋은 책이며, 번역본도 있습니다.

lsj0713의 이미지

C++에서는 malloc/free는 없다고 치는 것이 좋습니다. 굳이 쓸 이유가 전혀 없습니다.

체스맨의 이미지

girneter wrote:

일반 구조체의 경우에는 차이가 없나요?

C++ 는 struct 와 class 가 디폴트 접근 권한이 각각 public, private
인 것 말고는 차이가 없으므로, 일단 class 와 차이가 없습니다.

단, 다음과 같은 테크닉은 new로는 금기시되므로, 이런 류의
코딩을 C++ 에서 하려면 malloc 을 쓰는 게 좋습니다.


struct _a {
  int value;
  char name[1];
};
static const char s[] = "Hello, world";

struct _a* a = (struct _a*) malloc( sizeof(struct _a)+strlen(s) );
if( a ) {
  strcpy( a->name, s );
  free( a );
}

Orion Project : http://orionids.org

mastercho의 이미지

C++의 기본적인 책이면 항상 malloc과 new를

집고 넘어가는데요

C++ 기본 책 한권 정독하시길 추천 드립니다 --;

승자는 자기보다 우월한 사람을 보면 존경심을 갖고 그로부터 배울 점을 찾지만 패자는 자기보다 우월한 사람을 만나면 질투심을 갖고 어디 구멍난 곳이 없는지 찾는다.
- 하비스

cinsk의 이미지

따로 malloc(3)을 쓸 이유는 없습니다만,

system에서 따로 small memory allocator 전용의 memory allocation function을 제공한다거나 할 경우에는 operator new (new에 대한 이름이 두 가지였었는데, 기억이 잘 안남 -_-;; effective C++에서 봤는데.. C++ 쓴지 오래되서.. mastercho님이 대답해 주실겁니다. ^^;;;) 를 재정의해서 그 allocator를 쓰도록 할 필요도 가끔 있습니다.

libiberty (GCC나 GDB 소스에 포함되어 있음) 라이브러리에 보면 이런 목적으로 쓸 allocator가 obstack 또는 alloca가 있는데, (C 용입니다) 가끔 이 allocator를 쓰기도 합니다. C++에서도 new가 메모리를 할당할 때 이런 allocator를 쓸 수 있도록 만들 수 있을 것 같군요. 한번 해 보시길..

mastercho의 이미지

Quote:
effective C++에서 봤는데.. C++ 쓴지 오래되서.. mastercho님이 대답해 주실겁니다. ^^;; 를 재정의해서 그 allocator를 쓰도록 할 필요도 가끔 있습니다.

힙메모리에다가 new로 매번 할당할경우

상당한 오버헤드 [힙 할당의 오버헤드는 상당한거 같더군요] 를 유발하는데

operator new 재정의해 자기만의 메모리를 할당해 쓰는 경우 커널 함수 호출할 필요도 없이

자기 유저 메모리에 할당해놓은 자기 메모리에서
빠르게 할당받을수 있는 기법입니다

effective C++에서 이 기법을 소개 했지만
전혀 쓸 이유는 없다고 보고요
[쓰려다 보니 ,쓸때없이 클래스만 복잡해 지더군요]

차라리 boost 라이브러리에 메모리 풀을 쓰는것을
강력히 추천합니다

이것도 마찬가지 효과를 가지는데
훨씬더 유연하게 쓸수 있습니다

또한 기억이 가물한데 내부에서 vector를 사용해서
자동으로 메모리도 확장시켜주기도 하더군요

effective C++에서 소개한 방법을 쓰는것보다
이 라이브러리를 쓰는게 훨씬더 세련되고 유용한
방법입니다

자세한 설명은 길어질테니 boost 홈페이지의
레퍼런스를 참고 하시고요 :)

참고로 말씀드리자면 아마도 new를 오출하면
객체크기만큼 malloc으로 메모를 할당받은 다음에 객체의 생성자를
호출해 초기화 하는 방식일겁니다

승자는 자기보다 우월한 사람을 보면 존경심을 갖고 그로부터 배울 점을 찾지만 패자는 자기보다 우월한 사람을 만나면 질투심을 갖고 어디 구멍난 곳이 없는지 찾는다.
- 하비스

댓글 달기

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