得出的总结就是:delete的内容,必须为new出来的,栈分配的空间肯定是不能使用delete来释放,但堆上的也未必可以,当定义为static string s1=“The test class is SharedPtr”时,虽然是堆上的,但不是new出来的,delete的时候仍然会报错,感谢贴吧里二楼的那个哥们,一语惊醒梦中人,多谢!
SharedPtr.h
#pragma once
#include <string>
#include <iostream>
using namespace std;
class SharedPtr
{
public:
friend class NoName;
SharedPtr(string* p):sharedPtr(p),count(1){}
~SharedPtr(void);
private:
std::string *sharedPtr;
int count;
};
SharedPtr.cpp
#include "StdAfx.h"
#include "SharedPtr.h"
SharedPtr::~SharedPtr(void)
{
delete sharedPtr;
}
NoName.h
#pragma once
#include "SharedPtr.h"
class NoName
{
public:
NoName(void):pString(new SharedPtr(new string)),i(0),d(0){}
~NoName(void);
NoName(const NoName&noName):pString(noName.pString),i(noName.i),d(noName.d){
++pString->count;
}
void print();
int set(string**s);
private:
SharedPtr* pString;
int i;
double d;
};
NoName.cpp
#include "StdAfx.h"
#include "NoName.h"
NoName::~NoName(void)
{
if (--pString->count == 0) {
delete pString;
}
}
void NoName::print()
{
cout<<"The sharedPtr is "<<*(pString->sharedPtr)<<endl;
cout<<"The i is "<<i<<endl;
cout<<"The d is "<<d<<endl;
}
int NoName::set(string **s)
{
//为何此处赋值,程序会出错,修改后正常
pString->sharedPtr = *s;
i = 10;
d = 20;
print();
return 1;
}
copyInstruct.cpp
// copyInstruct.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "NoName.h"
int _tmain(int argc, _TCHAR* argv[])
{
//std::string s1("The Test of sharedPtr!");//错误情况
//将此处替换为如下所示
string *s1 = new string("The Test of sharedPtr!");
NoName no_name;
//no_name.set(s1);//错误情况
//此处直接传入new返回的指针,后来感觉此处应传入指针的指针,不然传副本的话,感觉不能delete掉该处的s1
no_name.set(&s1);
NoName no_name2(no_name);
no_name2.print();
return 0;
}