Dans mon programme, je crée un objet d'une classe dans une boucle et le stocke dans un vecteur. Ensuite, j'imprime l'adresse de l'objet et la variable membre. Après cela, je les efface. Je vois que chaque fois que je vois la même adresse assignée à mon objet et la variable membre qui est un pointeur. Quelqu'un peut-il expliquer ce comportement.Obtenir la même mémoire encore et encore
#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;
}
J'ajoute la sortie dans mon système
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
Il n'y a aucune raison pour laquelle vous ne pourriez pas recevoir la même adresse pour un nouvel objet du même type que celui qui vient d'être supprimé. Quel comportement vous attendiez-vous à voir? –
Pour être franc, mon problème est beaucoup plus grand. Je pense qu'un pointeur partagé résoudra mon problème. Je maintiens un vecteur d'objet de connexion tcp. Je les supprime du vecteur une fois qu'ils ne sont plus nécessaires. mais le vecteur est sous un mutex, donc au moment où je le supprime et le retire du vecteur, un autre objet avec la même adresse est créé et ajouté au vecteur. Mon critère de suppression était basé sur l'adresse de l'objet, donc maintenant dans le vecteur j'ai deux objets avec la même adresse qui est morte et une autre qui a été nouvellement créée. Cela me causait des accidents intempestifs. – punith
vous l'avez fait mal. vous devez modifier vos critères de suppression/ou/ne supprimez aucun objet lors de l'exécution du code de suppression (?) .... ou utilisez un pointeur intelligent. –