[c++] malloc したメモリを初期化する

この記事は、IT エンジニア向けです。

滅多に使わないので忘れるから、個人メモ。

c 言語ではメモリを確保する時に malloc を使う。
c++ では、同様に malloc を使う事も出来るが、普通は new を使う。

malloc はメモリを確保するだけだが、new はメモリ確保の後、確保したメモリの初期化まで行ってくれるからだ。

では問題。
c++ で、あえてメモリ確保に malloc を使用した場合、どうやって初期化すればよいか?

一般的に、メモリ確保処理は負荷が高い。
なので、c や c++ では一度に大量のメモリ確保を行う事がある。
インスタンスを 100 個作成する時、100 回メモリ確保をするより、1 回で100 個分のメモリ確保をした方がパフォーマンス的には良いのだ。

ただし、この時に new を使えない事が多々ある。
new でも複数インスタンスのメモリを一度に確保する事は可能なのだが、この場合コンストラクタに渡す引数がややこしい。
「引数無しのコンストラクタで初期化しておいて、後で各種設定を行う」で済む場合は良いのだが、そうとは限らない。

こんな場合は、初期化を行わない malloc の方が都合が良かったりする。
そうすれば、malloc でメモリ確保だけをしておいて、実際に使う直前にコンストラクタを呼び、初期化すれば良いのだから。

というわけで、malloc で確保したメモリに後からコンストラクタを走らせる方法のメモ。


#include <cstdlib>
#include <iostream>
#include <new>

using namespace std;

class Foo {
public:
  Foo(const char *msg) : msg_(msg) {}

  void hello() { cout << msg_ << endl; }

  ~Foo() {
    cout << "~";
    hello();
  }

private:
  const char *msg_;
};

void new_foo() {

  auto ptr = new Foo("new");
  ptr->hello();
  delete (ptr);
}

void malloc_foo() {

  auto ptr = malloc(sizeof(Foo));
  if (!ptr) {
    auto handler = get_new_handler();
    if (!handler)
      throw bad_alloc();
    else
      handler();
  }

  new (ptr) Foo("malloc");
  static_cast<Foo *>(ptr)->hello();
  static_cast<Foo *>(ptr)->~Foo();

  free(ptr);
}

int main() {

  new_foo();

  malloc_foo();

  return 0;
}

上記において、new_foo と malloc_foo は、ほぼ同様の働きをする。

new_foo は普通に new を使う方法だ。
new Foo ("new")で Foo クラスのインスタンスのメモリ確保、初期化を行い、メソッド hello を呼び出し、delete でメモリを解放している。

malloc_foo は、あえて malloc を使う方法。
最初にエラー処理以外の部分を見てみよう。

auto ptr = malloc(sizeof(Foo))で Foo に必要なサイズのメモリを確保する。
その後、new (ptr) Foo("malloc")とすると、ptr に確保されたメモリ上で初期化を走らせる。
この時、コンストラクタには “malloc” という const char * の引数を渡している。

その後 new_foo と同様にメソッド hello を呼び出す。

最後にメモリ解放をするのだが、malloc で確保したメモリは delete ではなく free で解放する必要がある。
free でメモリを解放する場合は明示的にデストラクタを呼ぶ必要があるので注意だ。

ついでなのでエラー処理についてもちょっと書いておく。
new にしろ malloc にしろ、メモリ確保は必ず成功するとは限らない。エラーが発生する可能性がある。

new の場合、デフォルトでは失敗時に bad_alloc クラスの例外が投げられる。
ただし、この処理は set_new_handler という関数で変更可能だ。
関数 new_foo では、この挙動に任せており特にエラー処理はしていない。

malloc の場合、失敗時は必ず null pointer が返される。
malloc_foo では、失敗時の挙動を new と同じになるようにしている。

つまり、返り値が null pointer の場合、まず set_new_handler で new のエラー処理が変更されているか確認する。
もし変更されていなければ、new のデフォルト動作である bad_alloc クラスの例外を投げる。
変更されている場合は、その関数を呼び出す。

以上、完全な俺メモでした。

Author: wbcchsyn

未来のスーパーエンジニア とりあえず、新しい物が大好き

91 thoughts on “[c++] malloc したメモリを初期化する”

  1. After study a few of the blog posts on your website now, and I truly like your way of blogging.

  2. I used to be very happy to find this web-site.I just wrote an very long comment but after I clicked submit my comment didn’t appear. Anyways, just wanted to say thnx

  3. My partner and I absolutely love your blog and find the majority of your post’s to be precisely what I’m looking for. Would you offer guest writers to write content for yourself? I wouldn’t mind composing a post or elaborating on some of the subjects you write in relation to here. Again, awesome site!

  4. Write more, thats all I have to say. Literally, it seems as though you relied on the video to make your point. You definitely know what youre talking about, why waste your intelligence on just posting videos to your site when you could be giving us something informative to read?

  5. This is a topic that’s near to my heart… Thank you! Exactly where are your contact details though?

  6. Many thanks really valuable. Will certainly share website with my good friends.

  7. Hi! Casting can help the developer identify inconsistencies in type sizing should the destination pointer type change, particularly if the pointer is declared far from the If the type of the pointer is changed at its declaration, one may also need to change all lines where

  8. I’d crave to meet up among all open to securing farther tangled in community issues about our specialty, network with me through my forum on the assumption that you feel the same.

  9. Ramipril is an angiotensin-converting enzyme (ACE) inhibitor. It works by blocking a substance in the body that causes blood vessels to tighten. As a result, ramipril relaxes the blood vessels. This lowers blood pressure and increases the supply of blood and oxygen to the heart.

  10. Hi

    I apologise, but, in my opinion, you are not right. Let’s discuss it. Write to me in PM, we will talk.
    Idea shaking, I support.

  11. Just desire to say your article is as astounding. The clearness in your post is just excellent and that i could assume you’re knowledgeable on this subject. Well with your permission allow me to grab your feed to keep updated with drawing close post. Thanks a million and please continue the rewarding work.

  12. Usually I do not learn article on blogs, however I would like to say that this write-up very pressured me to try and do it! Your writing taste has been surprised me. Thanks, quite great post.

  13. Your forum seemed to me exact attractive and promising.
    I fancy to steal ads seeking a month. Where should I play down to enter a quote?

  14. Mammoth site. Literate articles. Thanks to author. Conserve your website as a favorite

  15. Надеюсь подборка понравилась, следующая подборочка, будет про кошечек)

  16. Бородин Сергей Александрович 20.01.1983.
    Бородин Сергей Александрович-
    это лучший доктор.
    Сергей Александрович не только отличный специалист, но и очень проницательный человек. Клиенты Сергея Александровича
    чувствуют себя спокойно и комфортно, лечение проходит безболезненно, укол анестезии почти не чувствуется. Сергей Александрович дает ответы на все вопросы:
    спокойно и подробно объясняя, что он планирует делать и для чего и почему это нужно. Говорю огромное спасибо Сергею Александровичу за его труд.
    Бородин Сергей Александрович 20.01.1983

  17. Creative writing uchicago \ . # . + < . . . . . – . ^ . . . . ! > Pythagorean theorem assignment . . = # . + & \ . = . . + \ & – > $ . ! $ , =

  18. С каждым днем популярность компьютерных игр растет и в игровое комьюнити приходит все больше новых геймеров. И каждый из них пытается найти единомышленников, которые так же любят игры как и они. Портал PSHACK.NET создан, чтобы соединять любителей
    PSHACK.NET – один из самых популярных ресурсов на данную тематику. Наш сайт создан специально для геймеров. Каждый любитель найдет для себя кучу полезной и актуальной информации, получит халяву, найдет рабочие прокси сервера, бесплатный гта 5 ключ стим бесплатно.

    Преимущества портала
    ? На портале вы можете найти большое количество мануалов и статей, посвященных игровой тематике. Это и обзоры на игры, инструкции по прохождению игр, отзывы критиков (например, bf5 отзывы критиков)
    ? Найдете инструкции по подключению прокси сервера россии, прокси сервер скачать, прокси сервер онлайн. Лучшие прокси сервера вы найдете на портале
    ? На сайте огромное количество халявы и бонусов. Имеется бот бесплатных ключей стим , постоянно разыгрывают бесплатные стим ключи кс, бесплатные ключи стим на гта 5. Бот раздача может выдавать по 5 бесплатных ключей стим.
    ? На сайте вы можете найти кучу другого полезного софта, который поможет вам в ваших проблемах, например: avast driver updater key, bssid finder, cantresolve us чит на кс го, capmonster private keeper, combojack троян, проверка аккаунта на ботов и многое другое.
    ? На PSHACK.NET вы также можете обменивать, продавать или покупать аккаунт для самп даймонд рп, аккаунт стим с ксго и пубг, аккаунты black squad,
    аккаунты прайм ворлд, аккаунты с подпиской тнт премьер, аккаунты фортнайт бесплатно, аккуанты порнхаб

    ? На портале имеется также доступ к зеркалам сайтов, которые периодически банятся Роскомнадзором.
    ? Много различных тематических разделов. Есть слив инфопродуктов, курсов по бизнесу, саморазвитию и т.п., способы заработка. На сайте огромное количество знатоков, которые подскажут вам, как делать деньги в интернете, не выходя из дома. Заработок в интернете теперь доступнее с PSHACK.NET

    Лучший путеводитель в мире игр PSHACK.NET
    Администрация портала постаралась сделать ресурс максимально полезным для всех любителей игр разных возрастов. Ответы на популярные вопросы новичков содержит раздел FAQ. Администраторы PSHACK.NET готовы в любое время ответить на вопрос пользователя, если он не нашел ответов на ветках форума.

    Раздача халявы на сайте
    На сайте имеется куча способов получения бесплатных ништяков. Встроенный аккаунт бот выдает пользователям
    ? Скины CS GO(Цена: 15 PSCoins),
    ? Epic Games(Цена: 5 PSCoins),
    ? HMA – VPN 1-12 month (Цена: 30 PSCoins),
    ? Origin(Бесплатно).
    ? Uplay(Бесплатно),
    ? Vk koins (Цена: 1 PSCoins),
    ? Spotify(Бесплатно).

    Много халявы стим без депозита, предоставляют админы и добрые пользователи сайта. Ежедневно появляются тема с названием раздача стим ключей бесплатно, в которых люди оставляют код на ключи для стима бесплатно. Так что все зависит от вас. Мониторьте сайт, и один из ключиков обязательно станет вашим.

    Как зарегистрироваться?
    Регистрация пользователя проводится через форму.
    В ней указывают:
    ? Логин – индивидуальное имя юзера на ресурсе.
    ? E-mail для привязки аккаунта.
    ? Пароль
    ? Дата рождения
    Портал очень популярен и содержит огромную библиотеку данных. Потому хакеры регулярно штурмуют сайт. Обезопаситься от хакерских атак можно при помощи пароля, составленного из букв разного регистра и цифр. Заполнив форму регистрации, подтвердите, что вы не робот (через капчу и рекапчу). Активация аккаунта происходит через письмо на электронной почте. Указанный e-mail можно скрыть от глаз других юзеров ресурса.

    Аналогичные проекты
    PSHACK.NET подходит для всех любителей игр, халявы, бесплатных тем для заработка и просто общения.. Есть объективные причины, которые делают форум удобным для эксплуатации. В РуНете полно подобных ресурсов, но по функционалу ни один портал не сравнится с PSHACK.NET. Администрация PSHACK.NET настолько любит свою аудиторию, что почти все на сайте бесплатно. За все это администрация сайта просит лишь активность на сайте. Он полностью адаптирован для использования жителями государств СНГ и является площадкой для диалога между членами игорного комьюнити.
    Его преимущества таковы:
    ? обширная информационная база;
    ? большое количество участников
    ? универсальность;
    ? структурированность;
    ? функциональность;
    ? регулярные раздачи и розыгрыши;
    ? простая традиционная процедура регистрации;
    ? удобство общения;

    PSHACK.NET – ресурс, на который стоит обратить внимание каждому члену игрового сообщества. Он содержит: новости отрасли; площадки для диалога между продвинутыми геймерами; софт и прочее. Опытные юзеры и администрация ресурса готовы оперативно подыскать релевантную новичкам информацию, дать совет по решению проблемных ситуаций.

  19. as it is stored as string constant and the memory it is stored in, is read-only. If you use malloc instead, you can change the contents later on. For more information check this answer

  20. ТЕРСЕНОВ АРХИМЕД АРИСТОТЕЛЕВИЧ дата рождения 26 октября 1981. родился в Грузии жил с юных лет в с. Шпаковское (ныне г.Михаиловск) Ставропольский край. На данный момент проживает в Греции

  21. ТЕРСЕНОВ АРХИМЕД АРИСТОТЕЛЕВИЧ дата рождения 26.10.1981. родился в Грузии жил с юных лет в с. Шпаковское (ныне г.Михаиловск) Ставропольский край. На данный момент проживает в Греции

  22. Не первый раз покупаю в интернет-магазине восток-техно.рф и не первый раз убеждаюсь, что не ошибся. Предыдущие покупки были самовывозом. В этот раз заказал доставку и честно говоря волновался по срокам. Но не стоило. В отличии от других, более крупный и именитых магазинов, доставку осуществили как и обещали. Все прошло качественно и вовремя. Молодцы. Вот с такими магазинами и хочется работать. И товар и цены приемлемы. Буду рекомендовать Ваш магазин. Спасибо.

  23. Said this once or twice- got told like “cant believe you play computer games” like its for kids.

  24. CAB 토토 사이트 홍보를 해 왔던 총판입니다.
    작년12월부터 총판 수익금 526만원을 못받아서
    이렇게 먹튀 사이트에 글을 올리게 됐습니다,
    홍보를 꾸준히 해 오다가 홍보 방법이 막혀서 사전에 CAB운영진의 양해를 구해서
    7-8개월동안 홍보방법을 찾기위해 홍보를 못했습니다,
    그러다 올해 5월부터 홍보방법을 찾아서 홍보를 하다가
    도메인이 유해 사이트로 떠서 새로운 도메인 셋팅을 해 달라고 부탁드렸더니
    충분히 기다릴만큼 기다렸다고 도메인 셋팅을 안해주더군요,,
    홍보 준비하는 기간동안에 수익금은 500만원이 넘어 있었고,나는 정산금보다
    홍보를 계속하고 싶었는데,
    갑자기 도메인 셋팅을 안해준다고 하니,,,황당하더군요
    그래서 도메인 셋팅 안 해 줄거면 정산금을 정산해 달라고 햇더니
    “6개월반이나 기다려 아무성과가 없어서 정산금을 못주겟다네요,,
    그래도 5월에는 많지는 않지만 10여명정도 가입이 있었고,이제 어느정도 효과를 볼려고
    하는데
    정산금 주기 싫어서 같이 일을 못하겟다고 하니,,,이게 먹튀가 아니고 뭔가요?
    내가 이렇게 글을 올리는것도 사전에 CAB운영진에 미리 얘기를 드렸고,마음대로 하라고 하면서
    관리자 비번과 텔레그램까지 차단했고,CAB 사이트에 자세히 알아보니,일반 유저 먹튀도 여러건 발견되어
    이대로 나두면 안되겠다는 생각이 들어 이렇게 글을 올립니다.
    일단 저와 제가 아는 동생이 CAB에서 놀았던 입금 계좌를 경찰에 아는분한테 제출을 할겁니다.
    지금 CAB을 이용하고 계신분이나 이용하실분들은 나중에 통장 계좌가 노출되어 경찰 조사를 받는일이
    없도록 CAB토토사이트 이용을 자제해 주시기 바랍니다,
    그리고 CAB토토 사이트도 상황이 복잡해지면 일반유저 먹튀도 예상되니까,
    가능하면 다른 사이트 이용을 부탁드립니다!!

  25. Терсенов Архимед Аристотелевич – удивительно многогранная личность. В нем сочетаются вещи, которые диаметрально противоположны по сути. Веселые вечеринки на собственной яхте, активный отдых в горах, поездки на конференции Blockchain по всему миру. Спонсорская помощь, написание книг, изучение истории и при этом умение всегда выглядеть отлично. Как это удается? Секрет, хотя…просто у Архимед Аристотелевич огромный запас энергии, которую он расходует с удивительной щедростью!

  26. Жить по совести – это девиз Терсенова Архимеда Аристотелевича. Он, будучи человеком умным, деятельным, смог заработать солидный капитал, который тратит не только на отдых, но и на благотворительность. Восстановление храма, строительство детского садика, благоустройство поселков – это лишь малая толика тех добрых дел, которые господин Терсенов считает своим долгом совершать на протяжении долгих лет. Мы надеемся, что бог даст ему отличное здоровье, удачу и успехи на нелегком, но таком полезном поприще, как благотворительность!

  27. As a rule, having asked a question of installation of a ladder in the house, owners don’t assume that the ladder and its protection are two absolutely different products. Well, if the same company, like us, is engaged in the arrangement of turnkey facilities and can offer to make a ladder and metal fences on it in one set, but in practice it is rare. Therefore, before any owner of the stairs in the house the question arises: how to make it safe, we guarantee the best conditions for cooperation thanks to our own production, high potential design office and focus on long-term mutually beneficial partnership. Here you can buy not only standard fencing for stairs, but also design, made to order and is amazingly cheap. New construction technologies, developing rapidly, allow to use light, modern, reliable and weightless structures. Stair railings made of stainless steel are such that the price thereof is acceptable. Railings made of reliable material: an important structural element, part of the design of the building, the guarantors of safety and easy descent and ascent the stairs. Protections for ladders which are offered by our company differ in reliability, resistance to various aggressive influences and faultless appearance. In addition, their manufacture takes into account all kinds of standards and requirements relevant to this group of products. It is difficult to imagine a building in which there will be no stair railings, the presence of which increases the convenience, safety when moving. Note that today for the manufacture of construction offers a large selection of elements with which it is possible to quickly perform the installation of the structure, which for many years will last without losing the original qualities. Manufacturing and installation of stainless steel stairs is inexpensive compared to designs from other materials with equal quality characteristics. However, stainless steel is much more popular material-it is easy to handle, combine with other materials, install and care for the finished product

  28. Мири Агамирзаевич Угурлиев родился в 1968 году в Имишлинском районе Азербайджанской ССР в многодетной семье. Большое влияние на его развитие оказал отец – Угурлиев Агамирза Байрамович, который прошел всю Великую Отечественную Войну.

    К сожалению, его отец прожил недолгую жизнь: он умер в 1981 году в возрасте 60 лет. Но он передал свой огромный жизненный опыт своим детям.

    ?С 1985 по 1992 гг. Мири Угурлиев учился в Ивановском Государственном Университете (факультет правоведения). Весной 1986 году он был призван в ряды Советской Армии: в течение шести месяцев являлся курсантом в учебной части в Камышловском районе Свердловской области. В этот период Мири Угурлиев защитил звание кандидата мастера спорта по рукопашному бою.

    ???В октябре 1986 года был направлен на службу в Германскую Демократическую Республику, где в составе группы советских войск занимал должность Секретаря войскового отдела ВЛКСМ. За отличную службу ему было присвоено воинское звание – старшина.

    В период срочной службы в ГДР Мири Угурлиев проходил стажировку в военном госпитале, откуда получил направление для поступления на льготных условиях в Первый Московский Медицинский Институт имени Сеченова.

    “Однако по окончании службы в армии я решил не поступать в медицинский ВУЗ, а продолжить обучение в Ивановском Государственном Университете на факультете правоведения”, – рассказывает Мири Угурлиев.

    ?В 1992 года Мири Угурлиев переехал на постоянное жительство в Москву, где проживает и сейчас. Он является учредителем и генеральным директором ряда российских компаний: он президент сети компаний ООО “Мир детектива” (адрес: Москва, Большая Серпуховская, дом 31, корпус 6), ООО ЧОП “МИР”, а также ООО “5 ЗВЕЗД и ООО “Авто-Шанс XXI век” (ул. Неверовского, 8). Мири Угурлиев занимается активной общественной деятельностью.

  29. Здравствуйте. Читайте только правильные и актуальные новости!

    [url]http://xianglong.ru/[/url]
    [url]http://killroll.ru/[/url]
    [url]http://anugra.ru/[/url]
    [url]http://all4turbo.ru/[/url]
    [url]http://gsm-vsem.ru/[/url]
    [url]http://kurinki.ru/[/url]
    [url]http://hettriknn.ru/[/url]
    [url]http://tirlimonka.ru/[/url]
    [url]http://plitka-anapa.ru/[/url]
    [url]http://cityplumbers.ru/[/url]
    [url]http://imperia-iphone.ru/[/url]
    [url]http://valisoti.ru/[/url]
    [url]http://sosenskoe2018.ru/[/url]
    [url]http://phone10.ru/[/url]
    [url]http://1tell.ru/[/url]
    [url]http://amur-tigers.ru/[/url]
    [url]http://tagschool35.ru/[/url]
    [url]http://currenluxury55.ru/[/url]
    [url]http://armp3.ru/[/url]

  30. payday loan calculator ( # . % . . . – . & ^ ” . – < . @ + ) ( . # < Unification of mind # & ( @ $ . . . : + < * . . + % * = < $ . # .

  31. Positive emotions ^ . ^ ! < – . > . . – @ ! + > ? ^ ” – # . ^ > * . # . – . & < $ & \ . . "

Leave a Reply

コメントは反映されるまで数分かかります。
リンクのあるコメントはスパム判定されます。