gpt4 book ai didi

c++ - std::string 为 1 个字符串分配内存 2 次

转载 作者:行者123 更新时间:2023-12-01 13:46:36 35 4
gpt4 key购买 nike

#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";
}
当我尝试运行此代码时,它给了我以下输出:
Allocated: 8 Bytes
Allocated: 32 Bytes
Ahmed Zaki Marei
Deleted
Deleted
为什么它先分配 8 个字节然后分配 32 个字节?
有谁能解释一下吗?谢谢! :)

最佳答案

作为 C.M.评论中已经指出:这是 Debug模式下的 MS STL 行为,与 _ITERATOR_DEBUG_LEVEL 相关。在 Release 中一切都很好。
很好奇所以我自己测试了它,堆栈在 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) )在调试
_Fake_proxy_ptr_impl (什么都不做)在 Release 中。

关于c++ - std::string 为 1 个字符串分配内存 2 次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63496083/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com