所属命名空间及标识符:using std::shared_ptr
所属版本:C++98
g++启用版本命令:g++ -std=c++98 -c -o
补充:
如果启用c++11及以上标准,即g++ -std=c++11 -c -o,编译时会有一个警告信息提示
warning:‘auto_ptr’ is deprecated (‘auto_ptr‘被反对使用)
存在很多种智能指针,其中最有名的应该是C++98标准中的“自动指针”std::auto_ptr,它部分解决了获取资源自动释放的问题,例如:
#include <memory>
#include <iostream>
#include <string>
using std::cin
using std::cout
using std::string
using std::auto_ptr
class Report
{
private:
std::string str
public:
Report( const string s ):str(s) { cout <<"Object created!\n"}
~Report() { cout <<"Object deleted!\n"}
void comment(string owner) const { cout <<owner <<str <<"\n"}
}
int main(void)
{
auto_ptr<Report>ps (new Report("Using auto_ptr."))
ps->comment(string("ps:"))
auto_ptr<Report>p1
p1 = ps //赋值完毕后ps已经失去对内存对象的所有权,不可再使用
p1->comment(string("p1:"))
//ps->comment(string("after p1=ps:")) //error,Segmentation faul
}
/*Result:
Object created!
Using auto_ptr.
Object deleted!
*/
auto_ptr的构造函数接受new *** 作符或者对象工厂创建出的对象指针作为参数,从而代理了原始指针。虽然它是一个对象,但因为重载了 operator*后operator->,其行为非常类似指针,可以把它用在大多数普通指针可用的地方。当退出作用域时(离开作用域或异 常),C++会保证auto_ptr对象销毁,调用auto_ptr的析构函数,进而使用delete *** 作符删除原始指针释放资源。
auto_ptr很好用,被包含在C++标准库中令它在世界范围内被广泛使用,使用智能指针的思想、用法深入人心。但标注库没有覆盖智能指针的全部领域,尤其最重要的引用计数型智能指针。
在stdafx.h中添加如下语句饮用ADO智能指针#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
rename_namespace("ADOCG") rename("EOF", "EndOfFile") rename("BOF", "BeginOfFile")
using namespace ADOCG
否则编译器认为ADO智能指针未定义
filebuf::openprot //默认的兼容共享方式
filebuf::sh_none //独占,不共享
filebuf::sh_read //读共享
filebuf::sh_write //写共享
以上方式仅旧版VC中支持,新版VC在share.h中为Win32项目定义了如下方式
_SH_DENYRW 0x10 /* deny read/write mode*/
_SH_DENYWR 0x20 /* deny write mode */
_SH_DENYRD 0x30 /* deny read mode */
_SH_DENYNO 0x40 /* deny none mode */
_SH_SECURE 0x80 /* secure mode */
示例:fstream a_file(test.dat, ios::in | ios::binary, _SH_DENYRW)
此时使用其他程序打开test.dat将显示“此文件已被其他进程占用”
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)