Получение той же памяти снова и снова - PullRequest
0 голосов
/ 12 августа 2010

В моей программе я создаю объект класса в цикле и сохраняю его в векторе.Затем я печатаю адрес объекта и переменную-член.После этого я их стираю.Я вижу, что каждый раз вижу один и тот же адрес, назначенный моему объекту, и переменную-член, которая является указателем.Может ли кто-нибудь объяснить это поведение.

#include <iostream>
#include <vector>

using namespace std;

typedef struct csock {
unsigned int _refCount;
mutable pthread_mutex_t _pdata_mutex;
pthread_attr_t attr;
bool _bSocketClosed;            /// used for testing while closing the socket
int _iSockFD;                   /// Holds the native socket descriptor
void* _pfnArgs; 
void* _logger;                  /// For debug logging
bool _isServiceRunning; 
pthread_t _thread_id;           /// Thread id for the listener service
int _pipes[2];                  /// For stop signal communication
pthread_mutex_t* _countMutex;
unsigned long  _idleTimeOut;                //Idle Time Out
FILE* fp;
} __attribute__((packed)) csock_t;




class csocket
{
protected:
void* _pImpl;

public :

csocket(){
csock_t* ps = new csock_t;
this->_pImpl = reinterpret_cast<void*> (ps);
std::cout<<"\n ps is "<<ps <<" _pImpl is "<<_pImpl <<endl;
}
void* getImpl()
{
    return _pImpl;
}
};


int main ()
{

vector<csocket> v;

 for (int i=0; i< 5; ++i) {
    v.push_back(csocket());
    cout<<"\n after pushback "<<v[v.size()-1].getImpl();
    cout<<"\n after pushback object is"<<&(v[v.size()-1]);
    delete (csock_t*) v[0].getImpl();
    v.erase(v.begin()+0);
}
cout <<"\n size of vector is "<<v.size();
return 0;
}

Я добавляю вывод в моей системе

ps is 0x8368008 _pImpl is 0x8368008
after pushback 0x8368008
after pushback object is0x8368078

ps is 0x8368008 _pImpl is 0x8368008
after pushback 0x8368008
after pushback object is0x8368078

ps is 0x8368008 _pImpl is 0x8368008
after pushback 0x8368008
after pushback object is0x8368078

ps is 0x8368008 _pImpl is 0x8368008
after pushback 0x8368008
after pushback object is0x8368078

ps is 0x8368008 _pImpl is 0x8368008
after pushback 0x8368008
after pushback object is0x8368078

Ответы [ 3 ]

3 голосов
/ 12 августа 2010

После того, как вы delete объект, ранее захваченная память помечается как свободная, и ее владение передается в кучу, поэтому куче разрешается повторно использовать пространство, которое он занимал для будущих выделений. Так что просто так получается, что куча повторно использует один и тот же блок памяти.

1 голос
/ 12 августа 2010

После удаления объекта занимаемая им память возвращается во время выполнения (или, в некоторых случаях, к ОС) для повторного использования. Если вы идете и выделяете память для другого объекта точно такого же размера, а иногда даже немного меньше, этот кусок памяти, вероятно, лучше всего подходит - поэтому вполне разумно использовать этот кусок памяти вместо того, чтобы выделять другой кусок памяти откуда-то еще, что повышает вероятность фрагментации памяти позже.

0 голосов
/ 12 августа 2010

Я думаю, что вы ищете хранилище на основе слабого указателя.Ваш вектор хранит слабые указатели на объекты соединения.Ваше основное приложение получает общие указатели.Деструктор для вашего объекта соединения освобождает ресурс.Периодически вы можете упаковать вектор, удалив все слабые указатели с нулем use_count.

class Connect;

typedef boost::shared_ptr<Connect> ConnectPtr;
typedef boost::weak_ptr<Connect> ConnectWeakPtr;
typedef std::vector<ConnectWeakPtr> ConnectVector;

ConnectVector vector;

ConnectPtr ptr( new Connect ( ... ));

vector.push_back(ptr);

void pack() {
    ConnectVector tmp;
    BOOST_FOREACH(ConnectWeakPtr const & p, mMap){
        if (p.use_count() > 0){
            tmp.insert(p);
        }
        mMap.swap(tmp);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...