尝试了解在导入的静态方法上使用删除方法时的错误

Trying to understand error upon using deleted on imported static method

本文关键字:删除 方法 错误 静态方法 了解 导入      更新时间:2023-10-16

我在这里试图理解我的代码中的指针行为,我的问题是针对我已经注释掉的底部代码,我找到的信息都没有回答我拥有的问题。我的问题是为什么编译器给我使用未初始化的变量应用程序的错误,以及编写代码的好做法是什么,以及为什么我不能在这里使用删除应用程序。我正在使用Visual Studio 2017

文件应用程序.h

#pragma once
namespace Test
{
class _declspec(dllexport)Application
{
public:
Application();
~Application();
static void Run();
};
}

文件申请.cpp

#pragma once
#include "Application.h"

namespace Test {
Application::Application() {

}
Application::~Application() {

}

void Application::Run() {
while (true);
}
}

文件沙盒应用.cpp

namespace Test 
{
__declspec(dllimport)class Application 
{
public:
static void Run();
//may be virtual is must here?
~Application();
};
}
int main() 
{

/* this work Test::Application t;
t.~Application();*/
Test::Application app;
app.Run();
app.~Application();
// why the lines below gives error even though its probably never going to reach even if the 
//application is closed

/*Test::Application* app;
app->Run();*/

//delete app; use this or the below one both give error
//app->~Application();


return 0;
}

另外,我仍然想知道为什么在删除 main 内部的所有内容并添加代码的最后一部分时会出现编译器错误,我想知道为什么我不能这样做我想了解代码最后一部分中指针的行为,以便它对我来说有意义,我知道我不应该,但为什么? 而且如果只使用我的代码的底部两行而不删除.app;或应用程序->~应用程序((;我的代码仍然有效。我的意思是说如果我只使用测试::应用程序*应用程序;app->Run((;编译器没有给出任何错误,我的代码可以工作,但为什么我不能使用删除应用程序;

Test::Application* app;
app->Run();

delete app; use this or the below one both give error
app->~Application();

应用程序是一个指针,它没有初始化,你的IDE正在保护你免受未定义的行为的影响。

Test::Application app;
app.Run();

^ 这是有效的,因为它不是一个指针,它是一个初始化的对象。

Test::Application* app;
app->Run();

^ 这不起作用,因为您的指针未启动。

要使底部代码正常工作,请执行以下操作:

Test::Application* app = new Test::Application;
app->Run();

感谢大家的贡献

Test::Application app;
app.Run();

^ 这是有效的,因为它不是一个指针,它是一个初始化的对象。

Test::Application* app;
app->Run();

^ 这确实有效,这让我感到困惑,因为它正在工作,Visual Studio 也没有给出任何警告或错误,这是一个初学者的噩梦,为什么 visual sutdio 甚至让我在这里使用这个符号( -> (这里。 但只有当添加下一行中的任何一行时,它才会给出错误,例如delete app;

Test::Application* app;
app->Run();
delete app;

^ 这不起作用,只有在您添加例如delete app;时才会出错,但为什么?答案是,在删除对象之前,必须先创建它(使用 new(。正如每个人都在指示我的那样,我已经将 app 声明为指针,但尚未初始化它。Test::Application *app = new Test::Application();将创建一个新的应用程序对象并将其分配给应用变量。即使应用程序没有指向应用程序对象,app->Run()对我有用的原因,Run 方法被声明为静态,<- 在这里,我认为我仍然缺少一些东西。根据learncpp dot com

静态成员函数没有星号符号 (*(this 指针

静态成员函数有两个值得注意的有趣怪癖。 首先,由于静态成员函数未附加到对象, 他们没有这个指针!仔细想想,这是有道理的—— 此指针始终指向成员函数的对象 正在努力。静态成员函数不适用于对象,因此 不需要此指针。

二、静态成员函数可以直接访问其他静态成员函数 成员(变量或函数(,但不是非静态成员。这是 因为非静态成员必须属于类对象,而静态 成员函数没有要使用的类对象!

最后,切勿直接在对象上调用析构函数。删除对象(删除应用(将导致调用其析构函数。

为了使我的int main代码正常工作,我遵循提供的信息并完成了此操作:

Test::Application* app = new Test::Application;
app->Run();
delete app;