質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

656閲覧

operator newについて

apa

総合スコア68

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/07/21 17:06

operator new という演算子を取り扱っているプログラムで

p = static_cast<int*>(::operator new(sizeof(int)));
このようなサンプルがありました
(operator newに関しては未定義)

ここでoperator new の前に ::をもってくるのはどんな意味があるのか
またなぜ new だけだはなくnewの前にoperatorがくっついているのか(好みの問題??)
以上2点について回答いただけたらと思っております!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

operator new という演算子を取り扱っているプログラムで

私が誤解しているのかもしれませんが、私は、
「new は演算子であり、operator new は関数である」と認識しています。
すなわち、operator new は演算子ではない。

operator new は void * operator new(size_t); と定義されていて、
サイズを渡せばメモリ領域を確保してそのアドレスを返すだけの関数です。
例えば、次のように実装されているものと思っています。

C++

1void* operator new(size_t n) 2{ 3 void* p = malloc(n); 4 if (p == nullptr) throw std::bad_alloc(); 5 return p; 6}

int *p = new int; または int *p = new int(); は正しいけれど、
int *p = oprator new int または int *p = operator new(int); はエラーです。

また、oprator new(sizeof(int)) は正しいけれど、
new(sizeof(int)) はエラーです。

operator new は関数です。
一方 new は演算子で、型名にこれを適用すると、
operator new 関数でメモリ領域を確保し、
さらにその型にコンストラクタがあればそれを呼び出します。
そして、演算結果は「その型へのポインタ」です。void * ではありません。

投稿2020/07/21 19:47

編集2020/07/22 00:18
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

apa

2020/07/22 06:49

返信ありがとうございます。 なるほど 内部的にもともと定義されているんですね だから自分の見たサンプルでは定義されていなかったと・・・ だいぶ理解できましたありがとうございます!!
guest

0

operatorとはいえど所詮ちょっと変わった呼び出し方もできる関数に過ぎないのです。ってことを伝えたいのではないかとエスパーします。全体を見ないとなんともですが。

::はグローバル名前空間にある、という意味合いですね。

#include <new> int main() { ::operator new(sizeof(int)); }
prog.cc: In function 'int main()': prog.cc:5:17: warning: ignoring return value of 'void* operator new(std::size_t)', declared with attribute 'nodiscard' [-Wunused-result] 5 | ::operator new(sizeof(int)); | ~~~~~~~~~~~~~~^~~~~~~~~~~~~ In file included from prog.cc:1: /opt/wandbox/gcc-10.1.0/include/c++/10.1.0/new:126:26: note: declared here 126 | _GLIBCXX_NODISCARD void* operator new(std::size_t) _GLIBCXX_THROW (std::bad_alloc) | ^~~~~~~~

https://wandbox.org/permlink/AMdyESvpojzWE8iu

この警告文見たほうがわかりやすいかな?

投稿2020/07/21 17:39

編集2020/07/21 17:41
yumetodo

総合スコア5852

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

apa

2020/07/21 17:59

返信ありがとうございます。 つけても付けなくても特に変化がなくあったほうが わかりやすくなるということでしょうか?
yumetodo

2020/07/21 18:01

いえ、C++にはoverloadという機能がありますから単にわかりやすさの問題ではありません。ADLsとかUnqualified name lookupとかまあそんなかんじの単語で調べてみてください。
apa

2020/07/22 06:52

ありがとうございます 調べてみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問