0

いくつかの質問:

www.cprogramming.com のリンクされたリストの次のコードを見ていました。

struct node {
  int x;
  node *next;
};

int main()
{
  node *root;      // This will be the unchanging first node

  root = new node; // Now root points to a node struct
  root->next = 0;  // The node root points to has its next pointer
                   //  set equal to a null pointer
  root->x = 5;     // By using the -> operator, you can modify the node
                   //  a pointer (root in this case) points to.
}
  1. 最後に root を削除しないため、このコードは [小さな] メモリ リークを引き起こしますか?

  2. また、「ノード」が構造体ではなくクラスだった場合、これは何か違うでしょうか?

最後に、このコードの場合:

#include <iostream>

using namespace std;

class A
{
public:
A(){}
void sing()
{ cout << "TEST\n";}
};

int main()
{
A *a = new A();
a->sing();
return 0;
}
  1. メインを終了する前に A を削除する必要がありますか?
  2. A *a = new A()を使用する場合と比較して、どのような場合に使用しA a = A()ますか?
4

4 に答える 4

2

1.1 はい。ただし、最新のオペレーティング システムでは、プロセスが終了すると、すべてのメモリがオペレーティング システムによって回収されます。メモリ リークは、メモリ リークが継続し、明確な理由もなくプロセスが追加のメモリを要求し続ける、長期間存続するプロセスにとって大きな問題です。

1.2classオブジェクトではなく を意味していたと思います (オブジェクトはクラスまたは構造体のインスタンス化です) ... それでも、違いはclassなくstruct、デフォルトのアクセス指定子 ( s の場合public、esの場合)のみが異なります。 .structprivateclass

2.1 はい (1.1 と同じ注意事項があります)。

2.2 通常A、(a) スタックに配置するには大きすぎる場合、(b) ローカル変数によって課されるオブジェクトの有効期間 (=スコープの最後での自動破棄) が適切でない場合、(c) オブジェクトの数が作成されるかどうかは、コンパイル時にわかりません。

例:

を。Aその定義には、多くのスタックスペースを奪う非常に大きな行列が含まれています。または、Aそれほど大きくはありませんが、現在の呼び出しは再帰的であるため、スタックに置くとスタック オーバーフローが発生する可能性があります。

b. Aこの関数から返されるオブジェクトです (コピーは受け入れられません)。または、Aこの関数で作成され、将来他の関数によって削除されますが、現在のスコープの最後ではありません。

c. Aユーザーによって提供されたデータが入力されるリンクされたリストのノードです。ユーザーが提供したデータが終了するまで、ループでノードを作成して追加します。

于 2013-06-03T01:00:17.590 に答える
2

最初の部分:

  1. ずさんかもしれません (そして、Valgrind のようなツールはそれについて警告します)、すべてのメモリは OS によってmain返されるときに解放されます。プログラムの実行を続けてもメモリ リークが続く場合は、メモリ リークがより懸念されます。
  2. C++ では、「クラス」と「構造体」の間に区別はありません。A のclass初期アクセスは、パブリックではなくプライベートとして変更されているだけです。

後半は次のとおりです。

  1. 1と同じ。
  2. これはかなり複雑な質問です。大まかに言えばnew、オブジェクトが現在のスコープを超えて存続する必要がある場合 (たとえば、オブジェクトが構築された関数によって返される場合)、またはそのサイズが動的に決定されるか、などの理由で非常に大きくなります。
于 2013-06-03T01:00:23.653 に答える
1

最後に root を削除しないため、このコードは [小さな] メモリ リークを引き起こしますか?

はい。ただし、プログラムは終了し、メモリは OS によって再利用される必要があります。したがって、メモリリークチェックはこれにフラグを立てます。

また、「ノード」が構造体ではなくオブジェクトだった場合、これは何か違うでしょうか?

いいえ。構造体とクラスはほぼ同じですが、構造体のデフォルトの保護はpublic

メインを終了する前に A を削除する必要がありますか?

はい。メモリリークを避けるため。

A *a = new A() を使用する場合と A a = A() を使用する場合とでは、どのような場合に使用しますか?

を使用operator newすると、ヒープにメモリが割り当てられます。スタック フレームの寿命を超えてオブジェクトを存続させる必要がない限り、スタックに割り当てることをお勧めします。その場合は、コピーで返すか、ヒープに割り当てることができます。ヒープは、削除されるまでそこに残ります。

于 2013-06-03T01:02:52.523 に答える
0

前編

1) はい、メモリ リークがあります。

2) クラスと構造体の間に機能上の違いはありません。

第二部

1) はい、ヒープに割り当てたオブジェクトはすべて削除する必要があります。

2) ポインターを回避できる場合 (およびヒープ メモリの割り当てを回避できる場合) は、回避する必要があります。スタックを使用するための時間とリソースの使用量が少なくなります。この場合、オブジェクトの有効期間が非常に短いため、ヒープを使用しても意味がありません。

于 2013-06-03T00:57:12.437 に答える