stl_construct.h

本文详细解析了STL中对象的构造与析构机制,重点介绍了STL内部文件stl_construct.h的内容,包括成员函数的析构、placement new的使用及不同类型析构行为的实现。
stl_construct.h
// Filename:    stl_construct.h

// Comment By:  凝霜
// E-mail:      mdl2009@vip.qq.com
// Blog:        http://blog.youkuaiyun.com/mdl13412

/*
 *
 * Copyright (c) 1994
 * Hewlett-Packard Company
 *
 * Permission to use, copy, modify, distribute and sell this software
 * and its documentation for any purpose is hereby granted without fee,
 * provided that the above copyright notice appear in all copies and
 * that both that copyright notice and this permission notice appear
 * in supporting documentation.  Hewlett-Packard Company makes no
 * representations about the suitability of this software for any
 * purpose.  It is provided "as is" without express or implied warranty.
 *
 *
 * Copyright (c) 1996,1997
 * Silicon Graphics Computer Systems, Inc.
 *
 * Permission to use, copy, modify, distribute and sell this software
 * and its documentation for any purpose is hereby granted without fee,
 * provided that the above copyright notice appear in all copies and
 * that both that copyright notice and this permission notice appear
 * in supporting documentation.  Silicon Graphics makes no
 * representations about the suitability of this software for any
 * purpose.  It is provided "as is" without express or implied warranty.
 */

/* NOTE: This is an internal header file, included by other STL headers.
 *   You should not attempt to use it directly.
 */

#ifndef __SGI_STL_INTERNAL_CONSTRUCT_H
#define __SGI_STL_INTERNAL_CONSTRUCT_H

#include <new.h>        // 需要placement new的原型

__STL_BEGIN_NAMESPACE

// 调用成员的析构函数, 需要类型具有non-trivial destructor
template <class T>
inline void destroy(T* pointer)
{
    pointer->~T();
}

// 使用placement new在已经分配的内存上构造对象
// 如果你不熟悉placement new, 请参考
// http://msdn.microsoft.com/en-us/library/kewsb8ba.aspx
// http://blogs.msdn.com/b/jaredpar/archive/
//        2007/10/16/c-new-operator-and-placement-new.aspx
template <class T1, class T2>
inline void construct(T1* p, const T2& value)
{
  new (p) T1(value);
}

// 析构一组对象, 用于具有non-trivial destructor
template <class ForwardIterator>
inline void
__destroy_aux(ForwardIterator first, ForwardIterator last, __false_type)
{
  for ( ; first < last; ++first)
    destroy(&*first);
}

// 如果没有类型non-trivial destructor, 则使用此函数
template <class ForwardIterator>
inline void __destroy_aux(ForwardIterator, ForwardIterator, __true_type) {}

// 使用traits技术, 判断类型是否就有non-trivial destructor, 然后调用不同的函数
template <class ForwardIterator, class T>
inline void __destroy(ForwardIterator first, ForwardIterator last, T*)
{
  typedef typename __type_traits<T>::has_trivial_destructor trivial_destructor;
  __destroy_aux(first, last, trivial_destructor());
}

////////////////////////////////////////////////////////////////////////////////
// 用于销毁一组对象
////////////////////////////////////////////////////////////////////////////////
//                                                char *特化版本
//                                               ---------- destroy不进行析构
//                                               |
// destroy(first, last) -------------------------- 特化
//                                   |           |
//                                   |  泛化     ----------- destroy不进行析构
//                                   |           wchar_t *特化版本
//                                   ↓
//                调用 __destroy(first, last, value_type(first));
//                根据是否具有trivial destructor进行函数转发
//                                   |
//                                   |---------------- has trivial destructor?
//                                   |
//               -------------------------------------------
//        No     |                                         | Yes
//               |                                         |
//               ↓                                         ↓
// __destroy_aux(..., __true_type)           __destroy_aux(..., __false_type)
// 不进需要行析构操作                          for ( ; first < last; ++first)
//                                              destroy(&*first);
////////////////////////////////////////////////////////////////////////////////

template <class ForwardIterator>
inline void destroy(ForwardIterator first, ForwardIterator last)
{
  __destroy(first, last, value_type(first));
}

// 特化版本
inline void destroy(char*, char*) {}
inline void destroy(wchar_t*, wchar_t*) {}

__STL_END_NAMESPACE

#endif /* __SGI_STL_INTERNAL_CONSTRUCT_H */

// Local Variables:
// mode:C++
// End:

#0 __memcpy_generic () at ../sysdeps/aarch64/multiarch/../memcpy.S:163 #1 0x00000000004a0efc in std::_Construct<esw::SingleProcessedData, esw::SingleProcessedData&> (__p=<optimized out>) at /usr/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/include/c++/7.3.1/bits/stl_construct.h:75 #2 std::__uninitialized_copy<false>::__uninit_copy<esw::SingleProcessedData*, esw::SingleProcessedData*> (__result=<optimized out>, __last=<optimized out>, __first=0xffff637f0600) at /usr/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/include/c++/7.3.1/bits/stl_uninitialized.h:83 #3 std::uninitialized_copy<esw::SingleProcessedData*, esw::SingleProcessedData*> (__result=<optimized out>, __last=<optimized out>, __first=<optimized out>) at /usr/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/include/c++/7.3.1/bits/stl_uninitialized.h:134 #4 std::__uninitialized_copy_a<esw::SingleProcessedData*, esw::SingleProcessedData*, esw::SingleProcessedData> (__result=0x3ff09ee2435696e6, __last=0xffff637f0ab0, __first=0xffff637f0600) at /usr/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/include/c++/7.3.1/bits/stl_uninitialized.h:289 #5 std::vector<esw::SingleProcessedData, std::allocator<esw::SingleProcessedData> >::_M_range_insert<esw::SingleProcessedData*> ( this=this@entry=0xffff5c02c530, __position=<error reading variable: Cannot access memory at address 0xbfb6ea48ec621fc7>, __first=__first@entry=0xffff637f0600, __last=0xffff637f0ab0, __last@entry=0xffff637f0af0) at /usr/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/include/c++/7.3.1/bits/vector.tcc:657 #6 0x000000000049f45c in std::vector<esw::SingleProcessedData, std::allocator<esw::SingleProcessedData> >::_M_insert_dispatch<esw::SingleProcessedData*> (__last=<optimized out>, __first=0xffff637f0640, __pos=..., this=0xffff5c02c530) at /usr/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/include/c++/7.3.1/bits/stl_vector.h:1406 #7 std::vector<esw::SingleProcessedData, std::allocator<esw::SingleProcessedData> >::insert<esw::SingleProcessedData*, void> ( __last=<optimized out>, __first=0xffff637f0640, __position=..., this=0xffff5c02c530) at /usr/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/include/c++/7.3.1/bits/stl_vector.h:1132 #8 esw::MagTracking::SolveSingleSensor (this=0xffff5c02adb0, vecRawData=..., trackingResult=...) at /mnt/v1/wenzhao.huang/Emts-alg/BoardSoftware/Algorithm/src/emts_alg_mag_tracking.cpp:235 #9 0x0000000000436ac4 in esw::TerminalController::GetTrackingResult (this=this@entry=0xffff5c014778, singleDataVec=..., singleUnit=<optimized out>, exception=@0xffff5c01bd9a: 0, location=...) at /mnt/v1/wenzhao.huang/Emts-alg/BoardSoftware/Feature/src/emts_feature_terminal_controller.cpp:194 #10 0x0000000000434d2c in esw::TrackingManager::Run (this=0xffff5c013bf0) at /mnt/v1/wenzhao.huang/Emts-alg/BoardSoftware/Feature/src/emts_feature_tracking_manager.cpp:192 #11 0x0000ffff8707af9c in ?? () from /lib/aarch64-linux-gnu/libstdc++.so.6 #12 0x0000ffff871b2624 in start_thread (arg=0xffff8707af80) at pthread_create.c:477 #13 0x0000ffff86def62c in thread_start () at ../sysdeps/unix/sysv/linux/aarch64/clone.S:78
08-26
277 CMenu::~CMenu() (gdb) s 279 } (gdb) s 277 CMenu::~CMenu() (gdb) s std::vector<CMenu::Item, std::allocator<CMenu::Item> >::~vector (this=0x7fff91c2aa00, __in_chrg=<optimized out>) at /usr/include/c++/4.8.2/bits/stl_vector.h:414 414 ~vector() _GLIBCXX_NOEXCEPT (gdb) s 415 { std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish, (gdb) s _Destroy<CMenu::Item*, CMenu::Item> (__last=<optimized out>, __first=<optimized out>) at /usr/include/c++/4.8.2/bits/stl_vector.h:415 415 { std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish, (gdb) s _Destroy<CMenu::Item*> (__last=<optimized out>, __first=<optimized out>) at /usr/include/c++/4.8.2/bits/stl_construct.h:126 126 std::_Destroy_aux<__has_trivial_destructor(_Value_type)>:: (gdb) finish Run till exit from #0 _Destroy<CMenu::Item*> (__last=<optimized out>, __first=<optimized out>) at /usr/include/c++/4.8.2/bits/stl_construct.h:126 std::vector<CMenu::Item, std::allocator<CMenu::Item> >::~vector (this=0x7fff91c2aa00, __in_chrg=<optimized out>) at /usr/include/c++/4.8.2/bits/stl_vector.h:414 414 ~vector() _GLIBCXX_NOEXCEPT (gdb) s 415 { std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish, (gdb) s _Destroy<CMenu::Item*, CMenu::Item> (__last=<optimized out>, __first=<optimized out>) at /usr/include/c++/4.8.2/bits/stl_vector.h:415 415 { std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish, (gdb) s _Destroy<CMenu::Item*> (__last=<optimized out>, __first=<optimized out>) at /usr/include/c++/4.8.2/bits/stl_construct.h:126 126 std::_Destroy_aux<__has_trivial_destructor(_Value_type)>:: (gdb) finish Run till exit from #0 _Destroy<CMenu::Item*> (__last=<optimized out>, __first=<optimized out>) at /usr/include/c++/4.8.2/bits/stl_construct.h:126 std::vector<CMenu::Item, std::allocator<CMenu::Item> >::~vector (this=0x7fff91c2aa00, __in_chrg=<optimized out>) at /usr/include/c++/4.8.2/bits/stl_vector.h:416 416 _M_get_Tp_allocator()); } (gdb) s ~_Vector_base (this=0x7fff91c2aa00, __in_chrg=<optimized out>) at /usr/include/c++/4.8.2/bits/stl_vector.h:161 161 - this->_M_impl._M_start); } (gdb) s 160 { _M_deallocate(this->_M_impl._M_start, this->_M_impl._M_end_of_storage (gdb) s _M_deallocate (this=<optimized out>, __n=4, __p=0x10e3a250) at /usr/include/c++/4.8.2/bits/stl_vector.h:173 173 if (__p) (gdb) s 174 _M_impl.deallocate(__p, __n); (gdb) s deallocate (this=<optimized out>, __p=0x10e3a250) at /usr/include/c++/4.8.2/ext/new_allocator.h:110 110 { ::operator delete(__p); } (gdb) s std::vector<CMenu::Item, std::allocator<CMenu::Item> >::~vector (this=0x7fff91c2aa00, __in_chrg=<optimized out>) at /usr/include/c++/4.8.2/bits/stl_vector.h:416 416 _M_get_Tp_allocator()); } (gdb) s ~_Vector_base (this=<optimized out>, __in_chrg=<optimized out>) at /usr/include/c++/4.8.2/bits/stl_vector.h:416 416 _M_get_Tp_allocator()); } (gdb) s _M_deallocate (this=<optimized out>, __n=<optimized out>, __p=0x10e3a250) at /usr/include/c++/4.8.2/bits/stl_vector.h:416 416 _M_get_Tp_allocator()); } (gdb) s deallocate (this=<optimized out>, __p=0x10e3a250) at /usr/include/c++/4.8.2/ext/new_allocator.h:110 110 { ::operator delete(__p); } (gdb) s 0x00007f336d1d62e0 in operator delete(void*) () from /lib64/libstdc++.so.6 (gdb) finish Run till exit from #0 0x00007f336d1d62e0 in operator delete(void*) () from /lib64/libstdc++.so.6 main (argc=<optimized out>, argv=<optimized out>) at Src/mkconfig.cpp:2161 2161 } (gdb) s 0x00007f336c8b5555 in __libc_start_main () from /lib64/libc.so.6 (gdb) s Single stepping until exit from function __libc_start_main, which has no line number information. pure virtual method called terminate called without an active exception Program received signal SIGABRT, Aborted. 0x00007f336c8c9387 in raise () from /lib64/libc.so.6
08-31
155 50 C:\Users\admin\Documents\未命名4.cpp [Warning] multi-character character constant [-Wmultichar] 155 57 C:\Users\admin\Documents\未命名4.cpp [Warning] multi-character character constant [-Wmultichar] C:\Users\admin\Documents\未命名4.cpp In function 'Room create_room()': 31 12 C:\Users\admin\Documents\未命名4.cpp [Error] use of deleted function 'Room::Room(Room&&)' 15 8 C:\Users\admin\Documents\未命名4.cpp [Note] 'Room::Room(Room&&)' is implicitly deleted because the default definition would be ill-formed: 15 8 C:\Users\admin\Documents\未命名4.cpp [Error] use of deleted function 'std::mutex::mutex(const std::mutex&)' 4 0 C:\Users\admin\Documents\未命名4.cpp In file included from C:\Users\admin\Documents\未命名4.cpp 129 5 C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.9.2\include\c++\mutex [Note] declared here 33 0 C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.9.2\include\c++\x86_64-w64-mingw32\bits\c++allocator.h In file included from C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include/c++/x86_64-w64-mingw32/bits/c++allocator.h 46 C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.9.2\include\c++\bits\allocator.h from C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include/c++/bits/allocator.h 41 C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.9.2\include\c++\string from C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include/c++/string 40 C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.9.2\include\c++\bits\locale_classes.h from C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include/c++/bits/locale_classes.h 41 C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.9.2\include\c++\bits\ios_base.h from C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include/c++/bits/ios_base.h 42 C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.9.2\include\c++\ios from C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include/c++/ios 38 C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.9.2\include\c++\ostream from C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include/c++/ostream 39 C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.9.2\include\c++\iostream from C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include/c++/iostream 1 C:\Users\admin\Documents\未命名4.cpp from C:\Users\admin\Documents\未命名4.cpp C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.9.2\include\c++\ext\new_allocator.h In instantiation of 'void __gnu_cxx::new_allocator<_Tp>::construct(_Up*, _Args&& ...) [with _Up = Room; _Args = {Room}; _Tp = Room]': 253 4 C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.9.2\include\c++\bits\alloc_traits.h required from 'static std::_Require<typename std::allocator_traits<_Alloc>::__construct_helper<_Tp, _Args>::type> std::allocator_traits<_Alloc>::_S_construct(_Alloc&, _Tp*, _Args&& ...) [with _Tp = Room; _Args = {Room}; _Alloc = std::allocator<Room>; std::_Require<typename std::allocator_traits<_Alloc>::__construct_helper<_Tp, _Args>::type> = void]' 399 57 C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.9.2\include\c++\bits\alloc_traits.h required from 'static decltype (_S_construct(__a, __p, (forward<_Args>)(std::allocator_traits::construct::__args)...)) std::allocator_traits<_Alloc>::construct(_Alloc&, _Tp*, _Args&& ...) [with _Tp = Room; _Args = {Room}; _Alloc = std::allocator<Room>; decltype (_S_construct(__a, __p, (forward<_Args>)(std::allocator_traits::construct::__args)...)) = <type error>]' 97 40 C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.9.2\include\c++\bits\vector.tcc required from 'void std::vector<_Tp, _Alloc>::emplace_back(_Args&& ...) [with _Args = {Room}; _Tp = Room; _Alloc = std::allocator<Room>]' 932 36 C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.9.2\include\c++\bits\stl_vector.h required from 'void std::vector<_Tp, _Alloc>::push_back(std::vector<_Tp, _Alloc>::value_type&&) [with _Tp = Room; _Alloc = std::allocator<Room>; std::vector<_Tp, _Alloc>::value_type = Room]' 116 38 C:\Users\admin\Documents\未命名4.cpp required from here 120 4 C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.9.2\include\c++\ext\new_allocator.h [Error] use of deleted function 'Room::Room(Room&&)' 64 0 C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.9.2\include\c++\memory In file included from C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include/c++/memory 40 C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.9.2\include\c++\thread from C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include/c++/thread 2 C:\Users\admin\Documents\未命名4.cpp from C:\Users\admin\Documents\未命名4.cpp C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.9.2\include\c++\bits\stl_construct.h In instantiation of 'void std::_Construct(_T1*, _Args&& ...) [with _T1 = Room; _Args = {Room}]': 75 53 C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.9.2\include\c++\bits\stl_uninitialized.h required from 'static _ForwardIterator std::__uninitialized_copy<_TrivialValueTypes>::__uninit_copy(_InputIterator, _InputIterator, _ForwardIterator) [with _InputIterator = std::move_iterator<Room*>; _ForwardIterator = Room*; bool _TrivialValueTypes = false]' 125 41 C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.9.2\include\c++\bits\stl_uninitialized.h required from '_ForwardIterator std::uninitialized_copy(_InputIterator, _InputIterator, _ForwardIterator) [with _InputIterator = std::move_iterator<Room*>; _ForwardIterator = Room*]' 278 63 C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.9.2\include\c++\bits\stl_uninitialized.h required from '_ForwardIterator std::__uninitialized_copy_a(_InputIterator, _InputIterator, _ForwardIterator, std::allocator<_Tp>&) [with _InputIterator = std::move_iterator<Room*>; _ForwardIterator = Room*; _Tp = Room]' 301 69 C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.9.2\include\c++\bits\stl_uninitialized.h required from '_ForwardIterator std::__uninitialized_move_if_noexcept_a(_InputIterator, _InputIterator, _ForwardIterator, _Allocator&) [with _InputIterator = Room*; _ForwardIterator = Room*; _Allocator = std::allocator<Room>]' 423 43 C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.9.2\include\c++\bits\vector.tcc required from 'void std::vector<_Tp, _Alloc>::_M_emplace_back_aux(_Args&& ...) [with _Args = {Room}; _Tp = Room; _Alloc = std::allocator<Room>]' 101 54 C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.9.2\include\c++\bits\vector.tcc required from 'void std::vector<_Tp, _Alloc>::emplace_back(_Args&& ...) [with _Args = {Room}; _Tp = Room; _Alloc = std::allocator<Room>]' 932 36 C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.9.2\include\c++\bits\stl_vector.h required from 'void std::vector<_Tp, _Alloc>::push_back(std::vector<_Tp, _Alloc>::value_type&&) [with _Tp = Room; _Alloc = std::allocator<Room>; std::vector<_Tp, _Alloc>::value_type = Room]' 116 38 C:\Users\admin\Documents\未命名4.cpp required from here 75 7 C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.9.2\include\c++\bits\stl_construct.h [Error] use of deleted function 'Room::Room(Room&&)'
最新发布
09-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值