C++ 始终指向同一内存区域的唯一\u ptr

C++ 始终指向同一内存区域的唯一\u ptr,c++,unique-ptr,C++,Unique Ptr,考虑以下代码: using namespace std; int* get() { unique_ptr<int> p (new int[4]); return p.get(); } int main(int argc, char **argv) { int *arr1=get(); int* arr2=get(); for(int i=0;i<4;i++) { arr1[i]=i; arr2[i

考虑以下代码:

using namespace std;

int* get()
{
    unique_ptr<int> p (new int[4]);
    return p.get();
}
int main(int argc, char **argv)
{
    int *arr1=get();
    int* arr2=get();
    for(int i=0;i<4;i++)
    {
        arr1[i]=i;
        arr2[i]=i*2;
    }
    for(int i=0;i<4;i++)
        cout << arr1[i];
    return 0;
}
使用名称空间std;
int*get()
{
唯一的_ptr p(新的int[4]);
返回p.get();
}
int main(int argc,字符**argv)
{
int*arr1=get();
int*arr2=get();

对于(inti=0;i,我相当肯定你在玩不好的未定义行为

当唯一指针被销毁时,指向的数据被销毁,值是相同的,并且选择了相同的插槽,这是幸运的

对于指向数组类型的指针,请使用向量

std::vector<int> get()
{
    return std::vector<int>(4);
}

int main()
{ 
    std::vector<int> arr1=get();
    std::vector<int> arr2=get();
    return 0;
}
std::vector get()
{
返回std::vector(4);
}
int main()
{ 
std::vector arr1=get();
std::vector arr2=get();
返回0;
}
对于普通的单值指针,您可以返回唯一的\u ptr

std::unique_ptr<int> get(){
    return std::unique_ptr<int>(new int(0));
}
:::
std::unique_ptr<int> ptr=get();
std::unique_ptr get(){
返回std::unique_ptr(新int(0));
}
:::
std::unique_ptr ptr=get();

我敢肯定你在玩不好的未定义行为

当唯一指针被销毁时,指向的数据被销毁,值是相同的,并且选择了相同的插槽,这是幸运的

对于指向数组类型的指针,请使用向量

std::vector<int> get()
{
    return std::vector<int>(4);
}

int main()
{ 
    std::vector<int> arr1=get();
    std::vector<int> arr2=get();
    return 0;
}
std::vector get()
{
返回std::vector(4);
}
int main()
{ 
std::vector arr1=get();
std::vector arr2=get();
返回0;
}
对于普通的单值指针,您可以返回唯一的\u ptr

std::unique_ptr<int> get(){
    return std::unique_ptr<int>(new int(0));
}
:::
std::unique_ptr<int> ptr=get();
std::unique_ptr get(){
返回std::unique_ptr(新int(0));
}
:::
std::unique_ptr ptr=get();


此类智能指针的使用存在内存泄漏。unique\u ptr将使用运算符delete释放分配的内存,但您需要delete[]。此外,get函数的返回值将是无效的ptr,因为unique_ptr将释放分配的区域。如果需要动态分配的数组,请使用std::vector。

在此类智能指针的使用中存在内存泄漏。unique_ptr将使用运算符delete释放分配的内存,但您需要delete[]。此外,get函数的返回值将是无效的ptr,因为unique_ptr将释放分配的区域。如果需要动态分配的数组,请使用std::vector。

get返回后,p将超出范围并删除指针。您将需要返回unique_ptr。@BoBTFish:诊断正确,治疗错误。有什么原因不能执行此操作吗使用
std::array
std::vector
?两者都比自己乱搞内存分配要简单。在
unique\u ptr
上使用
get
几乎总是会被怀疑,如果不是完全错误的话。一旦get返回,p就会超出范围并删除指针。您需要eturn unique_ptr.@BoBTFish:诊断好,治疗不好。有什么理由不能使用
std::array
std::vector
?两者都比自己乱搞内存分配要简单。使用
get
on
unique_ptr
几乎总是会受到怀疑,如果不是完全错误的话。
std::move
在这里是不必要的,有一条规则说,在允许省略的地方,移动会自动使用,因此包括返回值。@BenVoigt cool谢谢,我想是这样的,我有点喜欢把它们放进去,因为它会自动记录,显示我返回重物的意图和理由。另外,
std::unique_ptr
std::auto_ptr
聪明得多,现在是为数组类型定义的…只要你将它与数组类型一起使用,例如
unique_ptr
。但是放置
std::move
实际上会损害优化,因为它会在编译器可以使用NRVO时强制移动。@BenVoigt在这种情况下谢谢你我会删除它。是的,我知道你可以对数组使用unique_ptr,但向量更适合使用它。
std::move
在这里是不必要的,有一条规则说,在允许省略的地方,移动会自动使用,所以包括返回值。@BenVoigt很酷,谢谢,我想是这样的,我有点喜欢放它们在“因为它自己”文档中,显示了我返回重物的意图和推理。此外,
std::unique_ptr
比以往的
std::auto_ptr
聪明得多,现在是为数组类型定义的……只要你将其与数组类型一起使用,例如
unique_ptr
。放置
std::move
实际上会伤害优化但在上,因为当编译器可以使用NRVO时,它会强制移动。@BenVoigt谢谢在这种情况下我会删除它。是的,我知道你可以对数组使用unique_ptr,但向量更适合它。这不是内存泄漏,而是使用了已经释放的内存。有两个问题第一个是内存泄漏,unique_ptr将使用运算符delete而不是delete[]在数组分配的情况下。Alex:你是对的,这很糟糕,但它仍然不是内存泄漏。这是未定义的行为,但典型的实现会调用错误数量的析构函数(这对于
int
来说是毫无意义的,因为析构函数很小)@BenVoigt:实际上不止这些,这只是未定义的行为。
new[]
的实现可能会在某个地方存储要销毁的元素数(以运行上述析构函数)如果是
new
,这将是愚蠢的,因此内存布局可能会有所不同。这不是内存泄漏,而是已经释放的内存的使用。有两个问题:第一个是内存泄漏,unique_ptr将使用delete操作符而不是delete[]在数组分配的情况下。Alex:你是对的,这很糟糕,但它仍然不是内存泄漏。这是未定义的行为,但典型的实现会调用错误数量的析构函数(这对于
int
来说是相当无意义的,因为析构函数很小)@BenVoigt:实际上不止这些,这只是未定义的行为。
new[]
wi的一个实现