一般部
あなたの質問に対する一般的な答えはノーです。できません。
その理由は、任意の値を格納するために使用されるメモリは、メイン メモリの別の部分から割り当てられ、new
演算子によって返されるポインターが指す値を格納するために使用されるメモリとして割り当てられるためです。
stackと呼ばれる関数で使用される値を格納するために使用されるメモリ位置は、プログラム フローが関数に入ると自動的に割り当てられ、関数が終了すると自動的にクリーンアップされます。
(もちろん、これを達成するために内部的に行う作業がいくつかありますが、コンパイラーが必要なセットアップとクリーンアップのコードを生成するため、自分で処理する必要はありません)
new
一方、演算子で生成されたポインターの値を格納するために使用されるメモリは、自動的にまったくクリーンアップされないメモリの別の部分 (しばしばheapと呼ばれます) から割り当てられます。
あなたの例では
サンプルコードを見てください:
struct get_struct() {
struct test_struct = new struct;
return test_struct;
}
最初の問題は、いくつかの構文エラーを修正した後でも、
struct structure get_struct() {
struct structure test_struct = new structure;
return test_struct;
}
コードは、次のようなエラーをスローするコンパイラでコンパイルされません。
error: conversion from ‘structure*’ to non-scalar type ‘structure’ requested
値を使用しnew structure
ないため、その値へのポインターのみが使用可能になります。両方の型を一致させるにはstruct strcuture *test_test = new structure;
、次のようにする必要があります:
struct structure get_struct() {
struct structure *test_struct = new structure;
return *test_struct;
}
どちらが値によって返され、test_struct に割り当てられたデータのコピーが作成されます。
このアプローチの問題点は、何が起こるかを詳しく見ていくとわかるように、メモリ ホールが生成されることです。
- 関数に入ると、ポインタの値を保持するのに十分なメモリが
struct structure
スタックに割り当てられます。
- オペレーターは、既に説明したメモリの他の部分の一般的な名前である、ヒープ上
new
に保持するメモリを割り当てます。struct structure
このメモリ位置へのポインタは test_struct に格納されます
test_struct が指す構造体構造のコピーが作成されます。
struct structure
関数に入ったときにポインタの値を格納するために割り当てられたメモリが解放されます。
このアプローチの問題点は、get_structure を離れるとポインターのみが返され、ポイントされたデータはシステムに返されないことです。そのコピーを保持していないため、delete
ステートメントで再度参照する機会がないため、そのメモリは事実上失われます。
何が起こったのかは次のとおりです。
call to return
main() ---------> get_struct() -------->
get_struct()
STACK
+--------------+ +--------------+ +--------------+
| structure_1; | | structure_1 | | structure_1 |
+--------------+ +--------------+ +--------------+
| | | ... | | |
| |
| test_struct *--+
+--------------+ |
| | |
|
HEAP |
|
| | | | | | |
| | +--------------+ | +--------------+
| | | structure |<+ | structure |
| | | data | | data |
+--------------+ +--------------+ +--------------+
メモリの損失を防ぐために、おそらく次のようなものを使用して、をdelete
離れる前にそれを行う必要がありました。get_structure()
struct structure get_struct() {
struct structure *test_struct = new structure;
struct ret = *test_struct;
delete test_struct;
return ret;
}