std :: get_temporary_buffer返回原始指针而ä¸æ˜¯æ™ºèƒ½æŒ‡é’ˆ

时间:2015-07-21 12:27:33

标签: c++ c++11 memory-management

std::get_temporary_buffer返回一个dim SOAPClient set SOAPClient = createobject("MSSOAP.SOAPClient") ,其中包å«æŒ‡å‘已分é…存储的开头和分é…的对象数的指针,其对应的唯一目的:std::return_temporary_buffer是释放内存之å‰å·²åˆ†é…std::pair。

这两个函数都ä½äºŽstd::get_temporary_buffer标题上,其主è¦ç›®çš„是æ供增强内存管ç†çš„工具(顾åæ€ä¹‰ï¼‰å¹¶ä½¿å†…存管ç†æ›´å®‰å…¨ã€‚

关于内存管ç†çš„安全性,<memory>标头还æ供了智能指针实用程åºï¼Œå®ƒå…许以RAIIæ–¹å¼ç®¡ç†å†…存,从而使内存管ç†å¼‚常安全。< / p>

C ++ 14还添加了std::make_unique辅助函数,因此我们现在å¯ä»¥é¿å…在许多情况下使用原始指针。

通过所有这些努力å‡å°‘原始指针的使用,实现<memory>返回原始指针而ä¸æ˜¯æ™ºèƒ½æŒ‡é’ˆæ˜¯éžå¸¸ä»¤äººå›°æƒ‘的。这就是为什么我想问:

  • std::get_temporary_buffer是å¦æœ‰ç†ç”±è¿”回原始指针而ä¸æ˜¯è¿”回智能指针?
  • 如果有这ç§â€œè€å¼çš„â€æ–¹å¼æ‰‹åŠ¨åˆ†é…和释放内存的原因,那么智能指针无法达到这个目标å—?

2 个答案:

答案 0 :(得分:6)

简å•çš„答案是std::get_temporary_buffer是在智能指针标准化之å‰åˆ›å»ºçš„,而在C ++ 11中更改std::get_temporary_buffer的返回值会破åä¾èµ–它的代ç ï¼Œè¿™æ˜¯ç»å¯¹ä¸å¯æŽ¥å—的对于C ++标准库。

现在,他们为什么没有标准化新的智能指针? 好å§ï¼Œä¹Ÿè®¸æ²¡æœ‰äººå¯¹æ‹¥æœ‰å®ƒæ„Ÿå…´è¶£ã€‚就个人而言,我å‘现有一个智能指针拥有许多对象是很奇怪的。如果您需è¦æ™ºèƒ½é˜µåˆ—,请使用std::vector。

答案 1 :(得分:3)

如果你查看get_temporary_buffer等人的旧SGI STL实现的文档,他们会说......

  

注æ„:get_temporary_bufferå’Œreturn_temporary_buffer仅用于å‘åŽå…¼å®¹ã€‚如果您正在编写新代ç ï¼Œåˆ™åº”使用temporary_buffer类。

这有效地承认了更好的自动化管ç†çš„å¯å–性。 GCC添加了temporary_buffer作为扩展å(请å‚阅here),但它从未进入标准版。它的长短ä¸æ˜¯å› ä¸ºå®ƒä¸é‚£ä¹ˆæœ‰ç”¨ï¼Œæ‰€ä»¥æ‹¥æœ‰æ›´å¥½çš„ç•Œé¢ä¸ä¼šæˆä¸ºä¼˜å…ˆäº‹é¡¹ã€‚æ“作系统的整个概念是在é¢å¯¹å¤§å¤šæ•°çŽ°ä»£æ“作系统使用的ä¹è§‚内存分é…策略时,是å¦åº”该为您æ供所有请求的内存或一些较å°æ•°é‡çš„è‹è‡ï¼Œå¹¶ä¸”一旦您获得多个呼å«è¯·æ±‚超过容易获得的记忆,对第一个过于慷慨让其他人有点饿死:åªæ˜¯ä¸æ˜¯ä¸€ä¸ªéžå¸¸å®žç”¨çš„概念。

如果您关心,å¯ä»¥ä¸ºä»¥åŽçš„C ++标准æ交æ案....