提前感谢帮助的人们。 我是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已触发断点。”
有谁能告诉我这个例外的原因是什么?
非常感谢
答案 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>