C++ &引用;未分配要释放的指针";删除分配的(?)指针时

C++ &引用;未分配要释放的指针";删除分配的(?)指针时,c++,pointers,c++14,clion,C++,Pointers,C++14,Clion,错误发生在“删除指针” 代码: OS:macOS Catalina 10.15.6(19F101) C++14 CMake:3.16.5(与CLion捆绑销售) gcc-v的输出: ❯ gcc -v Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/inclu

错误发生在“删除指针”

代码:

OS:macOS Catalina 10.15.6(19F101)

C++14

CMake:3.16.5(与CLion捆绑销售)

gcc-v的输出:

❯ gcc -v
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
Apple clang version 11.0.3 (clang-1103.0.32.29)
Target: x86_64-apple-darwin19.5.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

您尚未分配任何指针。你也对术语感到困惑。这里的分配是指动态分配。在动态分配中,您分配内存,并将该内存的地址分配给指针。内存分配有
new

因此,您的代码的正确版本是

#include <iostream>

int main() {
    int* pointer = new int(5);
    *pointer = 0;
    std::cout << "Value: " << *pointer << std::endl;
    delete pointer;
    std::cout << "This does print" << std::endl;
    return 0;
}
#包括
int main(){
int*指针=新的int(5);
*指针=0;

std::cout您没有分配任何指针。您还对术语感到困惑。这里的分配指的是动态分配。在动态分配中,您分配内存,并将该内存的地址分配给指针。内存分配为
new

因此,您的代码的正确版本是

#include <iostream>

int main() {
    int* pointer = new int(5);
    *pointer = 0;
    std::cout << "Value: " << *pointer << std::endl;
    delete pointer;
    std::cout << "This does print" << std::endl;
    return 0;
}
#包括
int main(){
int*指针=新的int(5);
*指针=0;

std::cout您应该只
删除
分配了
new
的指针。指向其他对象的指针将失效(这有点像已删除,但不完全如此)当对象超出范围时自动执行,因此您不必担心它。

您应该只删除分配了
new
指针。指向其他对象的指针将失效(有点像已删除,但不是完全删除)当对象超出范围时自动执行,因此您无需担心。

请阅读一本好书,然后,C++11标准请阅读一本好书,然后,C++11标准原始代码在我的机器上运行良好(?)。为什么从现有变量生成指针时不应使用
delete
?(使用&)。我对这个指针的东西还是很陌生,所以我只是出于好奇问一下。我认为指针需要删除,即使它指向一个现有的变量?
delete
只需要与
new
一起使用(而
delete[]
需要与
new[]
一起使用)。不确定你是从哪里得到所有指针都需要删除的想法的,这完全是错误的。记住,被删除的是内存而不是指针。因此,如果你有两个指针指向同一块动态分配的内存,你只需要删除一次。记住,内存被删除不是指针,这是术语mi我以前提到过的一个例子。你的代码在一台机器上工作而不是另一台机器上工作的原因是因为没有定义的行为。坏的C++程序不必崩溃,或者产生错误消息,它们都是未定义的行为,这意味着当你运行它们时,任何事情都可能发生,包括“工作”。谢谢解释。l代码在我的机器上运行良好(?)。为什么从现有变量生成指针时不应该使用
delete
(使用&)。我对这个指针的东西还是很陌生,所以我只是出于好奇才问。我认为指针需要删除,即使它指向一个现有变量?
delete
只需要与
new
一起使用(而
delete[]
需要与
new[]
一起使用)。不确定你是从哪里得到所有指针都需要删除的想法的,这完全是错误的。记住,被删除的是内存而不是指针。因此,如果你有两个指针指向同一块动态分配的内存,你只需要删除一次。记住,内存被删除不是指针,这是术语mi我以前提到过的一个例子。你的代码在一台机器上工作而不是另一台机器上工作的原因是因为没有定义的行为。坏的C++程序不必崩溃,或者产生错误消息,它们都是未定义的行为,这意味着当你运行它们时,任何事情都可能发生,包括“工作”。谢谢你的解释!谢谢。
#include <iostream>

int main() {
    int* pointer = new int(5);
    *pointer = 0;
    std::cout << "Value: " << *pointer << std::endl;
    delete pointer;
    std::cout << "This does print" << std::endl;
    return 0;
}