operator= - code in overloaded function doesn't get called

T

Tobias Langner

I overloaded the operator= - but in the program, if the line p3=p1 gets
executed, the program doesn't jump to the method.

The class definition and the test code.

template <class T, template <class> class OwnershipPolicy>
class SmartPtr : public OwnershipPolicy<T> {
public:
explicit SmartPtr(T* pointer);
SmartPtr(const SmartPtr<T, OwnershipPolicy>& otherPointer);
SmartPtr<T, OwnershipPolicy> &operator=(const SmartPtr<T, OwnershipPolicy>
&);
~SmartPtr();
T& operator*() const;
T* operator->() const;

private:
void deleteObject();
void copyPtr(const SmartPtr<T, OwnershipPolicy>& otherPointer);
SmartPtr();
T* pointer_;

};

//The Testcode:

bool testSmartPtr() {
SmartPtr<LongWrapper, RefCount> *p1=new SmartPtr<LongWrapper,
RefCount>(new LongWrapper(1));
SmartPtr<LongWrapper, RefCount> *p2=new SmartPtr<LongWrapper,
RefCount>(new LongWrapper(20));
SmartPtr<LongWrapper, RefCount> *p3=new SmartPtr<LongWrapper,
RefCount>(*p2);



std::cout<<"p1=p3\n";
p3=p1;

std::cout<<"delete p1\n";
delete p1;
std::cout<<"delete p2\n";
delete p2;
std::cout<<"delete p3\n";
delete p3;

return true;
}
 
J

John Harrison

Tobias Langner said:
I overloaded the operator= - but in the program, if the line p3=p1 gets
executed, the program doesn't jump to the method.

The class definition and the test code.

template <class T, template <class> class OwnershipPolicy>
class SmartPtr : public OwnershipPolicy<T> {
public:
explicit SmartPtr(T* pointer);
SmartPtr(const SmartPtr<T, OwnershipPolicy>& otherPointer);
SmartPtr<T, OwnershipPolicy> &operator=(const SmartPtr<T, OwnershipPolicy>
&);
~SmartPtr();
T& operator*() const;
T* operator->() const;

private:
void deleteObject();
void copyPtr(const SmartPtr<T, OwnershipPolicy>& otherPointer);
SmartPtr();
T* pointer_;

};

//The Testcode:

bool testSmartPtr() {
SmartPtr<LongWrapper, RefCount> *p1=new SmartPtr<LongWrapper,
RefCount>(new LongWrapper(1));
SmartPtr<LongWrapper, RefCount> *p2=new SmartPtr<LongWrapper,
RefCount>(new LongWrapper(20));
SmartPtr<LongWrapper, RefCount> *p3=new SmartPtr<LongWrapper,
RefCount>(*p2);



std::cout<<"p1=p3\n";
p3=p1;

std::cout<<"delete p1\n";
delete p1;
std::cout<<"delete p2\n";
delete p2;
std::cout<<"delete p3\n";
delete p3;

return true;
}

Well that's because p1, p2 and p3 are pointers.

I think perhaps what you meant to write is

SmartPtr<LongWrapper, RefCount> p1=SmartPtr<LongWrapper, RefCount>(new
LongWrapper(1));
SmartPtr<LongWrapper, RefCount> p2=SmartPtr<LongWrapper, RefCount>(new
LongWrapper(20));
SmartPtr<LongWrapper, RefCount> p3=p2;
std::cout<<"p1=p3\n";
p3=p1;

You seem to be getting your smart pointers and your ordinary pointers mixed
up.

john
 
J

Jakob Bieling

Tobias Langner said:
I overloaded the operator= - but in the program, if the line p3=p1 gets
executed, the program doesn't jump to the method.

The class definition and the test code.

template <class T, template <class> class OwnershipPolicy>
class SmartPtr : public OwnershipPolicy<T> {
public:
explicit SmartPtr(T* pointer);
SmartPtr(const SmartPtr<T, OwnershipPolicy>& otherPointer);
SmartPtr<T, OwnershipPolicy> &operator=(const SmartPtr<T, OwnershipPolicy>
&);
~SmartPtr();
T& operator*() const;
T* operator->() const;

private:
void deleteObject();
void copyPtr(const SmartPtr<T, OwnershipPolicy>& otherPointer);
SmartPtr();
T* pointer_;

};

//The Testcode:

bool testSmartPtr() {
SmartPtr<LongWrapper, RefCount> *p1=new SmartPtr<LongWrapper,
RefCount>(new LongWrapper(1));
SmartPtr<LongWrapper, RefCount> *p2=new SmartPtr<LongWrapper,
RefCount>(new LongWrapper(20));
SmartPtr<LongWrapper, RefCount> *p3=new SmartPtr<LongWrapper,
RefCount>(*p2);



std::cout<<"p1=p3\n";
p3=p1;

'p3' and 'p1' are pointers, not objects. That is why the operator= for
the 'object' does not get called, but the operator= for the 'pointer'. The
original value for 'p3' is lost, meaning you also have a memory leak.
std::cout<<"delete p1\n";
delete p1;
std::cout<<"delete p2\n";
delete p2;
std::cout<<"delete p3\n";
delete p3;

You have undefined behaviour here, because above you made 'p1' and 'p3'
point to the same object, which you now try to delete a second time. Your
program might have crashed here.
return true;
}

hth
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,579
Members
45,053
Latest member
BrodieSola

Latest Threads

Top