练习智能指针编程时出现的问题;
自定义头文件smartPtr.h如下:
#pragma once
class U_Ptr {
friend class BHasPtrs;
private:
int* ip;
size_t cnt; //计数
U_Ptr(int* p) :ip(p), cnt(1) {}
~U_Ptr() { delete ip; } //运行到该语句则产生中断
};
class BHasPtrs {
public:
BHasPtrs(int* p, int i) :ptr(new U_Ptr(p)), val(i) {}
BHasPtrs(const BHasPtrs& orig) :ptr(orig.ptr), val(orig.val) {
++ptr->cnt;
}
~BHasPtrs() {
if(--ptr->cnt==0)
delete ptr;
}
BHasPtrs& operator=(BHasPtrs rhs);
int* get_ptr() const { return ptr->ip; }
int get_int() const { return val; }
void set_ptr(int p) { *ptr->ip = p; }
void set_int(int i) { val = i; }
int get_ptr_val() { return *ptr->ip; }
void set_ptr_val(int val) { *ptr->ip = val; }
private:
int val;
U_Ptr* ptr;
};
BHasPtrs& BHasPtrs::operator=(BHasPtrs rhs) {
rhs.ptr->cnt++;
if (--ptr->cnt == 0) delete ptr; //如果是自己复制给自己,则cnt不需要加加,回到最初的状态,如果等于0,则删除指针
this->ptr = rhs.ptr;
this->val = rhs.val;
return *this;
};
xxxxx.cpp文件:
#include<iostream>
#include "smartPtr.h"
using namespace std;
void test_BHasPtrs() {
int obj = 2;
//调用了两次构造,因此最后调用两次析构函数
BHasPtrs ptr1(&obj, 42);
BHasPtrs ptr2(ptr1);
ptr2.set_ptr_val(6);
ptr2.set_int(48);
cout << "修改后:" << endl;
}
int main() {
cout << "智能指针:" << endl;
test_BHasPtrs();
return 0;
}
报错情况:
Invalid address specified to RtlValidateHeap( 000001873C960000, 000000168677F4F4 )
ManagePointers13.exe 已触发了一个断点。
不知道怎么修改,RtlValidateHeap是什么?会什么会报错?