标签:blog ar 使用 2014 on log ef new size
C11的新特性实在是太多了,这2个关键字关注的人倒是少了很多,其中有一个原因便是编译器支持得太慢了(VS到VS2013才支持上),不过这2个关键字那真是极为有用的,下面我们来看看。class CString
{
char* _str;
public:
//构造函数
CString(const char* pstr) : _str(nullptr)
{
UpdateString(pstr);
}
//析构函数
~CString()
{
if (_str)
free(_str);
}
public:
void UpdateString(const char* pstr) throw()
{
if (pstr == nullptr)
return;
if (_str)
free(_str);
_str = (char*)malloc(strlen(pstr) + 1);
strcpy(_str,pstr);
}
public:
char* GetStr() const throw()
{
return _str;
}
};我们可以这样使用:auto str = std::make_unique<CString>("123");
printf(str->GetStr());但是这样是不行的:auto str = std::make_unique<CString>(); //失败,因为没有一个无参构造函数
class CString
{
char* _str = nullptr;
public:
CString() = default;
public:
//构造函数
CString(const char* pstr) : _str(nullptr)
{
UpdateString(pstr);
}
//析构函数
~CString()
{
if (_str)
free(_str);
}
public:
void UpdateString(const char* pstr) throw()
{
if (pstr == nullptr)
return;
if (_str)
free(_str);
_str = (char*)malloc(strlen(pstr) + 1);
strcpy(_str,pstr);
}
public:
char* GetStr() const throw()
{
return _str;
}
};auto str_def = std::make_unique<CString>(); str_def->UpdateString(“123”); printf(str_def->GetStr() == nullptr ? "None":str_def->GetStr());
template<typename T>
class CStackMemoryAlloctor
{
mutable T* _ptr;
public:
explicit CStackMemoryAlloctor(size_t size) throw() : _ptr(nullptr)
{
_ptr = (T*)malloc(size);
}
~CStackMemoryAlloctor()
{
if (_ptr)
free(_ptr);
}
public:
operator T*() const throw()
{
T* tmp = _ptr;
_ptr = nullptr;
return tmp;
}
public:
T* GetPtr() const throw()
{
return _ptr;
}
};CStackMemoryAlloctor<wchar_t> str(128); wchar_t* pstr = str.GetPtr(); wcscpy(pstr,L"123\n"); wprintf(pstr);
auto p = std::make_unique<CStackMemoryAlloctor<wchar_t>>(128);
private:
void* operator new(std::size_t)
{
return nullptr;
}把new设置为private了,就行了,但是这样如果别人尝试new,那看到的错误提示简直惨不忍睹。。。public:
void* operator new(std::size_t) = delete;标签:blog ar 使用 2014 on log ef new size
原文地址:http://blog.csdn.net/a1875566250/article/details/40406883