0

グローバルヒープを使用してコードを記述しました。同じ操作を何度もやり直す必要があります。ヒープをクリアしてデータを再割り当てする必要があるたびに。ただし、vector :: clear()関数はメモリを解放しません。そのため、しばらくするとメモリがいっぱいになり、プログラムが終了します。

#include "stdafx.h"
#include <cstdio>
#include <vector>
using namespace std;

#define N 30000
typedef unsigned int uint;
class Node;
class Edge;
vector<Node*> nodes;
vector<Edge*> edges;

class Node
{
public:
    Node(uint id): id(id)
    {
        nodes.push_back(this);
    }
public:
    uint id;
};

class Edge
{
public:
    Edge(int nod1, int nod2)
        : nodH(nod1), nodT(nod2)
    {
        edges.push_back(this);
    }
    bool Connects(Node* nod1, Node* nod2)
    {
        return (
            (nod1->id == this->nodH && nod2->id == this->nodT) ||
            (nod1->id == this->nodT && nod2->id == this->nodH));
    }
public:
    int nodH;
    int nodT;
};

int _tmain(int argc, _TCHAR* argv[])
{
    Node *nd;
    for(long int i=0;i<N;i++)
    {
        for (int j=0;j<N;j++)
        {
            nd = new Node(j);
        }
        for (uint j=0;j<N;j++)
        {
            Edge* e = new Edge(j,N-j);
        }
        printf("%d %d ",nodes.size(),edges.size());

        // Do something here like calling function etc.
        nodes.erase(nodes.begin()+N/2);

        nodes.clear();
        edges.clear();
        //nodes.~vector();
        //edges.~vector();
        printf("%d %d\n",nodes.size(),edges.size());
    }
    getchar();
    return 0;
}

私に何ができる?vector ::〜vector()関数を試しました。しかし、それはうまくいきませんでした。「クリアされた」メモリスペースを解放する方法について誰かが私を助けてくれますか?

4

3 に答える 3

0

vector.clear()オブジェクトを削除しない理由は、2つのベクトルに生のポインタを保持するためです。

vector<Node*> nodes;
vector<Edge*> edges;

自分で要素の割り当てを解除するか、より適切には、スマートポインタ(たとえばstd::unique_ptr)を使用する必要があります。

于 2013-03-22T09:56:08.610 に答える
0

アプリケーションに1つの巨大なメモリヒープを割り当てています。N最初は100に減らしてみてください。bad_alloc通常、ランタイムがメモリを予約できなかったことを意味します。

于 2013-03-22T09:56:24.330 に答える
0

よく知られているトリックは、ベクトルを一時的に作成されたものと交換することです

template< class T >
void clearVector( std::vector< T > & v )
{ 
    std::vector< T > dummy;
    std::swap( v, dummy );
}

ところで、生のポインタでベクトルを使用するのは良い考えではありません。std::shared_ptrなどをお勧めします。(いくつかの驚くべき理由で)スマートポインタを使用できない場合は、次のような関数を呼び出す必要があります

struct die {
    template <class T> void operator()( const T * p ) const { delete p; }
};
template< class InputIterator >
inline void kill_em_all( const InputIterator & begin, const InputIterator & end )
{
    std::for_each( begin, end, die() );
}

...
kill_em_all( vector_to_clear.begin(), vector_to_clear.end() );
于 2013-03-22T09:57:28.010 に答える