带有“new”的指针和带有“& variable”的指针之间有什么区别

时间:2017-04-25 00:52:20

标签: c++ pointers

我有一个简单的问题但有时候我有点困惑。

第一个代码:

<a data-activator="classroom-panel-activator"
           data-toggle="collapse"
           [attr.data-parent]="'#accordion-' + day.date"
           href="#info-panel-{{ schedule.referenceId }}"
           >
            Click me
</a>

第二个代码:

Person *ptoPerson = new Person;
cout << ptoPerson->printMsg("Hi") << endl;
delete ptoPerson;

删除指针时会出现问题 第一个代码工作正常,指针删除,但实现它时第二个代码在运行时发生。

为什么第二个代码无法删除指针?
我认为这两种情况下的指针是一个指针,可以删除它,或者我错了。

4 个答案:

答案 0 :(得分:5)

  

我认为两种情况下的指针是一个指针,可以删除它,或者我错了。

你错了。

你没有删除指针&#34 ;;删除使用new创建的内容(通过将指向该内容的指针传递给delete运算符)。

在这里,您没有使用new创建任何内容,因此delete没有任何内容。

理想情况下,您的代码看起来像这样:

Person p;
cout << p.printMsg("Hi") << endl;

答案 1 :(得分:1)

Person *ptoPerson = new Person

此指针指向内存区域(新Person),它由程序员从堆中分配。在 ptoPerson 指令变为无用之后,您必须将其删除,否则会导致内存泄漏

Person p;
Person *ptoPerson = &p;

此指针指向堆栈内存区域,由编译器维护。当区域超出代码范围时,编译器会自动删除它。如果你手动删除堆栈的内存区域,程序将崩溃,因为这是程序的非法操作。

更多详细信息,请点击此博客C++ MEMORY ALLOCATION

答案 2 :(得分:0)

当指针为=new时,表示指针为其内容分配动态内存,当一个点设置为&variable时,表示指针指向那个变量的引用。因此,您可以delete动态分配内存而不是变量。

答案 3 :(得分:0)

This answer解释了为什么第二个例子在运行时发生错误。

  

您正在遇到未定义的行为。