I have been using C++ for a long time, but I didn't pay much attention to the assignment operator and copy constructor until I encountered the "_BLOCK_TYPE_IS_VALID" error.
It took me several hours of googling to figure out the reason.
with this code:
class A {
int* val;
public:
A(int v) {
val = new int(v);
}
~A() {
delete val;
};
A test() {
A a(2);
A b(3);
a = b;// assignment operator
return a;
}
we got the "_BLOCK_TYPE_IS_VALID" because when the class does not contain any pointers, the default assignment provided by Compiler is sufficient even it just performs a shadow copy.
but dealing with classes that contain pointers we can get _BLOCK_TYPE_IS_VALID(pHead->nBlockUse).
This error often occurs in Visual Studio when memory corruption or invalid memory access is encountered.
Similarly, in a Linux environment, you may encounter dump values or other exceptions.
so do not forget to define our own assignment operator.
class A{
int* val;
public:
A(int v){
val = new int(v);
}
// assignment operator
A& operator=(const A& obj){
*val = *obj.val;
}
~A(){ delete val;)
};
A test(){
A a(2);
A b(3);
a = b;// assignment operator called
return a; // copy constructor ??
}
but still we got error?. because the return a; make a copy of a before return.
so we also need our own copy constructor
and this code will work without error:
class A{
int* val;
public:
A(int v){
val = new int(v);
}
// assignment operator
A& operator=(const A& obj){
*val = *obj.val;
}
//copy constructor
A(const A& obj){
if(val) delete val;
val = new int(*obj.val);
}
~A(){ delete val;)
};
A test(){
A a(2);
A b(3);
a = b;// assignment operator called
return a; // copy constructor ??
}
Top comments (0)