ページ 11

c++のnew演算子について

Posted: 2017年8月30日(水) 14:01
by fly3555

コード:

int main(){
	int *p;

	p = new int[1];

	p[0] = 0;
	p[1] = 1;
	p[2] = 2;

	delete[] p;

	return 0;
}
これを実行すると何のエラーもなく通ります。p[1],p[2]に関してはメモリの確保を行っていないのに代入できて大丈夫なのでしょうか。

Re: c++のnew演算子について

Posted: 2017年8月30日(水) 15:49
by Math
int arrはint *(arr+i)のsyntactic sugarだからです

http://dixq.net/forum/viewtopic.php?f=3&t=8134

Re: c++のnew演算子について

Posted: 2017年8月30日(水) 18:19
by asd
fly3555 さんが書きました:
これを実行すると何のエラーもなく通ります。p[1],p[2]に関してはメモリの確保を行っていないのに代入できて大丈夫なのでしょうか。
pはint型の要素1つ分しか確保していないのでp[1]やp[2]にアクセスしてはいけません。
配列の添え字の範囲チェックはしてくれないのでエラーも出なければ、なんとなく動作するかもしれませんが、
p[1]やp[2]の領域はほかの用途で使われる可能性もあるので読み取りも書き込みもしてはいけません。
(ほかの変数領域を破壊したり、おかしな値が取得できたりと意図しない動作をします)
Math さんが書きました:int arrはint *(arr+i)のsyntactic sugarだからです

http://dixq.net/forum/viewtopic.php?f=3&t=8134


糖衣構文(syntactic sugar)であっても*(p+1)や*(p+2)にアクセスしてはいけません。
リンク先でも指摘されていることではありますが誤解しないようご注意ください。