动态分配的int数组的共享指针触发了一个断点

时间:2014-01-02 17:04:35

标签: c++ visual-studio-2013 shared-ptr

提前感谢帮助的人们。 我是C ++的新手。我正在学习智能指针/共享指针的概念并使用Visual Studio 2013RC。按照维基百科中的示例,我创建了一个像这样的共享指针

SharedPointer.cpp

#include <iostream>
#include <memory>
//using namespace std;
void main(){
    std::shared_ptr<int> sp1(new int(5), std::default_delete<int[]>());
    //std::shared_ptr<int> sp2 = sp1;
    for (int i = 0; i < 5; i++)  sp1.get()[i]= i;
    for (int i = 0; i < 5; i++) std::cout << sp1.get()[i] << std::endl;
    system("pause");
}

程序编译并打印出0,1,2,3,4没有任何错误,但随后窗口显示“SharedPointer.exe已触发断点。”

有谁能告诉我这个例外的原因是什么?

非常感谢

2 个答案:

答案 0 :(得分:5)

您应该在这里使用int[5]而不是int(5)

std::shared_ptr<int> sp1(new int[5], std::default_delete<int[]>());

目前,您的代码分配了一个int,它被初始化为5,然后它尝试将其作为五个int的数组(未定义的行为)进行访问。之后,智能指针尝试使用int运算符(而不是“普通”delete[]运算符)删除delete,这也是一种未定义的行为。

答案 1 :(得分:3)

sp1在程序结束时被销毁,导致默认删除器运行。此处的默认删除器会调用delete[],但由于您未使用new[],因此无效。

事实上,从事物的外观来看,你的意思是new int[5]而不是new int(5),因为你也试图访问这个内存块的五个元素,实际上你只分配了一个。< / p>