我有一个简单的问题但有时候我有点困惑。
第一个代码:
<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;
删除指针时会出现问题 第一个代码工作正常,指针删除,但实现它时第二个代码在运行时发生。
为什么第二个代码无法删除指针?
我认为这两种情况下的指针是一个指针,可以删除它,或者我错了。
答案 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解释了为什么第二个例子在运行时发生错误。
您正在遇到未定义的行为。