删除visualstudio标题中的void指针
deleting void pointer in visual studio headers
我在visualstudio头文件中发现了一些地方,通过指向void的指针释放内存。
xlocnum文件:
template<class _Elem>
class numpunct
: public locale::facet
{
_PROTECTED:
_VIRTUAL __CLR_OR_THIS_CALL ~numpunct()
{ // destroy the object
_Tidy();
}
...
protected:
void __CLR_OR_THIS_CALL _Init(const _Locinfo& _Lobj)
{ // initialize from _Lobj
_Grouping = 0;
_Falsename = 0;
_Truename = 0;
_TRY_BEGIN
_Grouping = _MAKLOCSTR(char, _Ptr->grouping, _Lobj._Getcvt());
_Falsename = _MAKLOCSTR(_Elem, _Lobj._Getfalse(), _Lobj._Getcvt());
_Truename = _MAKLOCSTR(_Elem, _Lobj._Gettrue(), _Lobj._Getcvt());
_CATCH_ALL
_Tidy();
_RERAISE;
_CATCH_END
...
}
...
private:
void __CLR_OR_THIS_CALL _Tidy()
{ // free all storage
_DELETE_CRT_VEC((void *)_Grouping);
_DELETE_CRT_VEC((void *)_Falsename);
_DELETE_CRT_VEC((void *)_Truename);
}
...
const char *_Grouping; // grouping string, "" for "C" locale
const _Elem *_Falsename;// name for false, "false" for "C" locale
const _Elem *_Truename; // name for true, "true" for "C" locale
};
或者xlocale中的另一个例子:
template<> class _CRTIMP2_PURE ctype<char>
: public ctype_base
{
public:
explicit __CLR_OR_THIS_CALL ctype(const mask *_Table = 0,
bool _Deletetable = false,
size_t _Refs = 0)
: ctype_base(_Refs)
{ // construct with specified table and delete flag for table
...
if (_Table != 0)
{ // replace existing char to mask table
_Tidy();
_Ctype._Table = _Table;
_Ctype._Delfl = _Deletetable ? -1 : 0;
}
}
protected:
void __CLR_OR_THIS_CALL _Tidy()
{ // free any allocated storage
if (0 < _Ctype._Delfl)
free((void *)_Ctype._Table);
else if (_Ctype._Delfl < 0)
delete[] (void *)_Ctype._Table;
}
}
正如在https://stackoverflow.com/a/941959/1549256通过void指针删除是C++标准未定义的。
为什么在这种情况下释放记忆是正确的?
标准库实现中的代码不必符合语言定义。它可以利用实施方面的知识;这就是它与编译器一起提供的原因。
未定义并不意味着它不会工作,它只是意味着实现可以自由地做任何它想做的事情,包括工作正常
删除强制转换指针的一个可能问题是,可能不会调用析构函数,但如果类型没有在删除时需要反转的构造函数,则这可能不是问题。
相关文章:
- 如何在 C++ 中将 void 函数传递给 void 指针
- 将通用引用强制转换为可调用的 void 指针,反之亦然
- C++为 void 指针分配一个字符串
- 为什么在将 void 指针转换为整数指针时出现分段错误
- 取消引用 void 指针以将值分配给结构
- C 与 C++,处理 void** 指针
- 除了调用全局删除运算符之外,删除一个void指针还能做什么呢
- 用非零值初始化void指针的正确(或最安全)方法
- 将 void 指针分配给另一个 void 指针
- c ++ 我是否需要手动删除指向另一个具体类型的 void* 指针?
- 如何将 std::string 作为构造函数参数传递,并将其保存的 C 字符串存储在 void 指针中?
- 如何将 std::string 赋回作为 <char>void* 指针传递的 std::vector.data()?
- 将指针传递到结构,与传递 void 指针并强制转换为结构
- 如何在void*指针下检查运行时类型(允许简单类型,没有基类)?
- 用于初始化结构的 void 指针强制转换
- 使用 void 指针:void **ptr.. 如何修改共享内存的值?
- 访问由 void 指针引用的结构的成员
- 你不能在 void 指针上使用指针算法,那么 void 指针数组是如何工作的呢?
- 如何警告 C 中 void 指针上的参数不兼容的类型
- 指向类模板方法的 void 指针的向量