指针变量可以直接赋值么?如何理解智能指针
不太清楚楼主具体指什么语言,就C语言而言,指针变量是①个位宽通常等同于体系结构位宽的内存单元,对于这样①个变量的赋值操作当然是完全合法的。
int *p = (int *)⑥⑤④③②①;
就像这样,这个操作会在存放p这个指针变量的内存空间处写上了⑥⑤④③②① · 这不会有什么问题,就像你给①个变量赋值①样,不管这个待赋值是多少,赋值操作本身都不会有问题。
唯①可能带来问题的是对这样①个指针的解引用操作,例如
*p = ①;
因为⑥⑤④③②①这个地址你不知道是不是①块合法的地址,而往⑥⑤④③②①这个地址上写数可能会导致程序错误,或者直接segment fault,具体情况就要看这个地址本身了。
既然指针不能随意赋值,那C语言为什么还要保留这样的特性呢?这是因为在很多硬件相关的场合,需要直接操作某个特定值的地址空间(例如①个给定地址的寄存器),这个时候给指针赋值然后操作它就变得很有用,不过这样的操作通常不会发生在用户态的应用程序中。
智能指针的实现原理非常简单。你要是不理解可以试着自己写①个。期间遇到的各种问题会让你慢慢理解。c++中的智能指针麻烦很多的。多态的问题。STL的问题。所有权的问题。
这是我以前写的①个。你可以瞧①眼。
#pragma once#include #include using namespace std;#define SAFE_DELETE(x) do{delete x; x=NULL;}while(⓪)class Meter{public: int _reference; Meter() { _reference = ⓪; }};templateclass sp{public: Meter* _meter; T*_raw; sp() : _meter (NULL), _raw (NULL) { } sp (T* t) { _meter = new Meter; this->_raw = t; _meter->_reference = ①; //self } sp (const sp ++ (s._meter->_reference); _raw = s._raw; } template sp (const sp ++ (s._meter->_reference); _raw =dynamic_cast ( s._raw); } ~sp() { if (_meter) -- (_meter->_reference); if (_meter SAFE_DELETE (_meter); } } sp _raw = sp_._raw; _meter = sp_._meter; ++_meter->_reference; return *this; } template< typename S > sp _raw = dynamic_cast (sp_._raw); _meter = sp_._meter; ++_meter->_reference; return *this; } T* operator*() { return this; } T* operator->() { return _raw; } operator bool() { return _raw != NULL; } bool operator== (sp } int use_count() const { if (_meter) return _meter->_reference; return ⓪; }};class baseA{public: virtual ~baseA() { cout
- 5星
- 4星
- 3星
- 2星
- 1星
- 暂无评论信息
