(找到原因了)(又改了下,感觉有个最下面那块函数,应传入指针的指针)求求哪位大神给看看吧,为何注释部分放开竟然会出错,琢磨一天了啊,万分感谢!!!!!!!!!!!!!!!!!!!!

得出的总结就是: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;
}




 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值