如何解决std :: string为1个字符串分配2次内存
"http://192.168.1.3:3000/users"
当我尝试运行此代码时,它会给出以下输出:
#include <iostream>
#include <string>
void* operator new(size_t size) {
std::cout << "Allocated: " << size << " Bytes\n";
return malloc(size);
}
void operator delete(void* var) {
std::cout << "Deleted\n";
free(var);
}
int main() {
std::string name0 = "Ahmed Zaki Marei";
//std::string name1 = "Lara Mohammed";
std::cout << name0 << "\n";
//std::cout << name1 << "\n";
}
为什么先分配8个字节然后分配32个字节? 有人可以解释吗?谢谢! :)
解决方法
以C.M.已经在注释中指出:这是Debug模式下的MS STL行为,与_ITERATOR_DEBUG_LEVEL有关。发行版中一切正常。
很好奇,所以我自己进行了测试,并且堆栈在new
的第一个断点处读取了此信息:
operator new(unsigned int size)
std::_Default_allocate_traits::_Allocate(const unsigned int _Bytes)
std::_Allocate<8,std::_Default_allocate_traits,0>(const unsigned int _Bytes)
std::allocator<std::_Container_proxy>::allocate(const unsigned int _Count)
std::_Container_proxy_ptr12<std::allocator<std::_Container_proxy>>::_Container_proxy_ptr12<std::allocator<std::_Container_proxy>>(std::allocator<std::_Container_proxy> & _Al_,std::_Container_base12 & _Mycont)
std::string::basic_string<char,std::char_traits<char>,std::allocator<char>>(const char * const _Ptr)
main()
让我们看一下basic_string
构造函数:
basic_string(_In_z_ const _Elem* const _Ptr) : _Mypair(_Zero_then_variadic_args_t{}) {
auto&& _Alproxy = _GET_PROXY_ALLOCATOR(_Alty,_Getal());
_Container_proxy_ptr<_Alty> _Proxy(_Alproxy,_Mypair._Myval2);
_Container_proxy_ptr
的真实含义是
#if _ITERATOR_DEBUG_LEVEL == 0
#define _GET_PROXY_ALLOCATOR(_Alty,_Al) _Fake_allocator()
template <class _Alloc>
using _Container_proxy_ptr = _Fake_proxy_ptr_impl;
#else // _ITERATOR_DEBUG_LEVEL == 0
#define _GET_PROXY_ALLOCATOR(_Alty,_Al) static_cast<_Rebind_alloc_t<_Alty,_Container_proxy>>(_Al)
template <class _Alloc>
using _Container_proxy_ptr = _Container_proxy_ptr12<_Rebind_alloc_t<_Alloc,_Container_proxy>>;
#endif // _ITERATOR_DEBUG_LEVEL == 0
它是_Container_proxy_ptr12
(最终调用.allocate(1)
)在Debug中
和_Fake_proxy_ptr_impl
(不执行任何操作)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。