编译器不会使用 -std=c++11 编译智能指针

compiler won't compile smart pointer using -std=c++11

本文关键字:c++11 编译 智能 指针 -std 编译器      更新时间:2023-10-16

我正在尝试编译一个简单的共享指针声明,但使用 cmd 使用g++ -std=c++11 main.cpp -o main,但由于某些原因它抛出一堆错误。我尝试在堆栈溢出上找到类似的问题,但没有一个与我的问题相匹配。

法典:

std::shared_ptr<int[]>array(new int[100]);

头文件:

#include<iostream>
#include<memory>

编译器版本: g++ (MinGW.org GCC-6.3.0-1( 6.3.0

错误:

In file included from c:mingwlibgccmingw326.3.0includec++bitsshared_ptr.h:52:0,
from c:mingwlibgccmingw326.3.0includec++memory:82,
from main.cpp:2:
c:mingwlibgccmingw326.3.0includec++bitsshared_ptr_base.h: In instantiation of 'std::__shared_ptr<_Tp, _Lp>::__shared_ptr(_Tp1*) [with _Tp1 = int; _Tp = int []; __gnu_cxx::_Lock_policy _Lp = (__gnu_cxx::_Lock_policy)2u]':
c:mingwlibgccmingw326.3.0includec++bitsshared_ptr.h:117:32:   required from 'std::shared_ptr<_Tp>::shared_ptr(_Tp1*) [with _Tp1 = int; _Tp = int []]'
main.cpp:7:42:   required from here
c:mingwlibgccmingw326.3.0includec++bitsshared_ptr_base.h:885:39: error: cannot convert 'int*' to 'int (*)[]' in initialization
: _M_ptr(__p), _M_refcount(__p)
^`

我是相对较新的,不知道此错误意味着什么。 任何建议都会有所帮助。

C++17之前,std::shared_ptr不能处理动态分配的数组。升级您的编译器以支持C++17您的代码将愉快地编译。

编辑:早期版本有一个解决方法。您可以使用

std::shared_ptr<int> sp(new int[10], custom_deleter<int>{});

其中custom_deleter将是一个用于释放分配的内存的函数。在这种情况下,简单的delete[](而不是shared_ptr析构函数内部的隐式delete(就足够了:

template< typename T >
struct custom_deleter
{
void operator ()(const T* arr)
{ 
delete[] arr; 
}
};

但是由于您已经在使用C++11,可以用lambda 表达式替换结构,这将简化代码:

std::shared_ptr<int> sp(new int[10], [](const int* arr){ delete[] arr; });

"无法转换..."error 是类型错误,表示您使用了错误的数据类型。在这种情况下,它特别告诉您std::shared_ptr<int[]>的构造函数需要int (*)[]参数类型,但您提供的参数类型为int *。由于编译器不知道如何从int *转换为int (*)[],因此您会收到此错误。

在任何情况下,您都不应该使用shared_ptr来管理 C 样式数组。我建议切换到 STL 容器,无论是std::array<int, N>还是std::vector<int>,具体取决于您是否知道编译时的大小。如果您愿意,可以将任何 STL 容器类型放入智能指针中。