私はテンプレートクラスを持って期待通りに動作していないチェックし、削除が
template <class T>
class Node
{
private:
T data;
public:
Node<T> *next;
Node(T initial);
~Node();
};
とデストラクタです:
template <class T>
Node<T>::~Node()
{
if (std::is_pointer<T>::value)
{
delete this->data;
}
}
template <class T>
LinkedList<T>::~LinkedList() {
Node<T> *this_nodes = this->head;
Node<T> *next = NULL;
while (this_nodes)
{
next = this_nodes->next;
delete this_nodes;
this_nodes = next;
}
}
をしかし、私はとG ++でコンパイルしようとしたときにC++ 11
:、以下のドライバコードLinkedList<int> list;
list.insert(5);
assert(list.read() == 5);
で、私は次のエラーを取得します
error: type ‘int’ argument given to ‘delete’, expected pointer
ノードはLinkedListの内部ですが、この質問に答えるのには完全には必要ではないので中止しました。私は、データを削除しようとする前にポインタであることを確認するためのチェックがあるので、なぜこのエラーが表示されるのか分かりません。
誰かがこれがうまくいかない理由/代替方法であることを私に少し詳しく教えてもらえますか? (注:この割り当てのためのスマートポインタを使用することはできません)
'削除this->データを;' - 'データを'は' int'です。なぜそれを '削除 'しようとしていますか? enchroudingする 'Node'は何を削除すべきか(そうでなければあなたのデストラクタは起動しないでしょう)。ポインターではないものを失格にしようとしている場合は、SFINAEや特殊化などのコード自体を省略する必要があります。実行時ifブロックではありません。 –
WhozCraig
なぜあなたは 'data'を最初から削除していますか?ほっといて。あなたのクラスは、データが動的に割り当てられているかどうかはわかりません。ポインタは 'new'で割り当てられる必要はないので、ポインタチェックは保証されません。 – PaulMcKenzie
ドライバユーザーの他の部分は、int *、Card *(カスタムクラス)、その他いくつかの要素のような他の要素です。これらのデータは空のコンストラクタで削除されず、そのメモリを解放する方法がわかりません。私はデータがintであることを知っているので、if文は失敗し、何もしません。実際のポインタを型として取得したときにのみ反応する必要があります(ノードなど) –
ZeldaZach