一次又一次地获得相同的记忆

时间:2010-08-12 10:42:24

标签: c++ vector

在我的程序中,我在循环中创建一个类的对象并将其存储在向量中。然后我打印对象的地址和成员变量。之后我擦掉它们。我看到每次看到分配给我的对象的同一地址和作为指针的成员变量。任何人都可以解释这种行为。

#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 个答案:

答案 0 :(得分:3)

在你delete对象之后,它之前被掩盖的内存被标记为空闲,并且它的所有权被传递给堆,因此允许堆重用它占用的空间用于将来的分配。所以只是堆重复使用完全相同的内存块。

答案 1 :(得分:1)

删除对象后,它占用的内存将被传回运行时(或在某些情况下传递给操作系统)以供重用。如果你为另一个完全相同大小的对象分配内存,有时甚至更小一点,那么这块内存可能是最合适的 - 所以使用那块内存而不是雕刻另一块大块是很合理的来自其他地方并且稍后会增加内存碎片问题的可能性。

答案 2 :(得分:0)

我认为你要找的是基于弱指针的存储。您的 vector存储指向连接对象的弱指针。你的主要应用 获取共享指针。连接对象的析构函数释放了 资源。您可以定期通过擦除所有弱指针来打包矢量 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);
    }
}