当前位置: 首页 > 知识库问答 >
问题:

在C #中,Null如何成为“this”的可能值?[已关闭]

糜淇
2023-03-14

编辑问题以包括所需的行为、特定问题或错误以及重现问题所需的最短代码。这将帮助其他人回答问题。

我对我的一个本地C类中的空值“this”感到困惑。

我这样声明stdafx.h中的类:

extern Filing* Files;

然后像这样stdafx.cpp实现它:

Filing* Files = new Filing();

调试器阻塞了这个方法,并抛出一个“写访问冲突”:消息还说:“这是nullptr”。

void Filing::Startup()
{
this->ExePath = this->GetPathToExe(); //Throws right here
this->LogDirectoryPath = this->GetLogDirectoryPath();
CreateDirectory(LogDirectoryPath->c_str(), NULL);
}

这怎么可能?我该如何解决这个问题?下面是完整的“归档”标题和定义。

备案. h:

#pragma once

#include <Windows.h>
#include <sstream>

using namespace std;

class Filing
{
  public:
     Filing();
     ~Filing();

/// <summary>
/// The path to this exe.
/// </summary>
     wstring* ExePath;

/// <summary>
/// The path to the log folder that exists or will be created.
/// </summary>
    wstring* LogDirectoryPath;

/// <summary>
/// Kicks off some startup logic.
/// </summary>
    void Startup();

/// <summary>
/// Determines if the specified directory exists.
/// </summary>
/// <param name="Path"></param>
/// <returns></returns>
    bool DoesDirectoryExist(string* Path);

  private:

/// <summary>
/// Returns the directory from which this executable is running from.
/// </summary>
    wstring* GetPathToExe();

/// <summary>
/// Gets the path to the log directory.
/// </summary>
/// <returns></returns>
    wstring* GetLogDirectoryPath();
};

归档.cpp:

#include "stdafx.h"
#include "Filing.h"

Filing::Filing()
{
   this->Startup();
}

Filing::~Filing()
{
   delete this->ExePath;
   delete this->LogDirectoryPath;
}

void Filing::Startup()
{
   this->ExePath = this->GetPathToExe();
   this->LogDirectoryPath = this->GetLogDirectoryPath();
   CreateDirectory(LogDirectoryPath->c_str(), NULL);
}

bool Filing::DoesDirectoryExist(string* Path)
{
   DWORD ftyp = GetFileAttributesA(Path->c_str());

   if (ftyp == INVALID_FILE_ATTRIBUTES)
   {
     Console->WriteLine("Invalid path!");
     return false;  //something is wrong with your path!
   }

   if (ftyp & FILE_ATTRIBUTE_DIRECTORY)
   {
      return true;   // this is a directory!
   }

   return false;    // this is not a directory!
}

wstring* Filing::GetPathToExe()
{
   #ifdef UNICODE
   TCHAR ownPth[260];
   #else
   char ownPth[MAX_Path];
   #endif // UNICODE

   // Will contain exe path
   HMODULE hModule = GetModuleHandle(NULL);
   if (hModule != NULL)
   {
      // When passing NULL to GetModuleHandle, it returns handle of exe itself
      GetModuleFileName(hModule, ownPth, (sizeof(ownPth)));
      return new wstring(ownPth);
   }
   else
   {
      throw new exception("Error! NullPointerException!");
   }
}

wstring* Filing::GetLogDirectoryPath()
{
   //if (this == nullptr)
   //{
   //   int i = 0;
   //}

   wstring *directory;
   const size_t last_slash_idx = ExePath->rfind('\\');
   if (string::npos != last_slash_idx)
   {
      directory = new wstring(ExePath->substr(0, last_slash_idx));
      directory->append(L"\\Logs");
   }
   else
   {
      throw new exception("Error! Directory not found from path!");
   }
   return directory;
}

到目前为止,我尝试过的事情:

清理并重建。

初始化归档。

编辑:

我看到一些关于不使用stdafx.h和stdafx.cpp的评论。我现在正把它们用于全局变量/类。我如何在其他地方定义它们,同时仍然是全球性的?

编辑2:

将错误一直追溯到一个小GetTime()函数。

const char* Writer::GetTime()
{
    string* Formatted = new string("[");
    time_t rawtime;
    tm* timeinfo;
    char buffer[80];
    time(&rawtime);
    timeinfo = std::localtime(&rawtime);

    strftime(buffer, 80, "%Y-%m-%d-%H-%M-%S", timeinfo);
    Formatted->append(buffer);
    Formatted->append("]: ");

    const char* Ret = Formatted->c_str();

    delete Formatted;
    delete timeinfo;//Errors here SOMETIMES. Any ideas?
    return Ret;
}

共有1个答案

伯博
2023-03-14

下面是一个程序示例,它可能会导致您看到<code>这<code>设置为空指针。(我说这可能是因为根据C语言规范,该程序调用未定义的行为,因此从技术上讲,编译器可以自由崩溃或输出PacMan的可执行文件,或响应此源代码而执行的任何其他操作……但在许多编译器实现中,常见的行为是空this指针。Ahem):

#include <stdio.h>

class Foo
{
public:
   Foo() {/* empty*/}

   void bar() {printf("this=%p\n", this);}
};

int main(int, char **)
{
   Foo * f = NULL;
   f->bar();  // undefined behavior here: calling a method on a NULL object!
   return 0;
}

当我运行这个程序时,我得到这样的输出:

$ ./a.out 
this=0x0

不用说,在任何真正的程序中都不应该这样做。

至于您自己的代码,最有可能的解释是您在空指针上调用Startup()方法。解决方案是跟踪您调用Startup()的所有位置,并在调用其上的任何方法之前确保它们调用startu()的指针非空(并指向有效对象)。

 类似资料:
  • 问题内容: 我的数据库中有一列被键入,并且我想使用JDBC ResultSet从中读取值,但是它可能为null。最好的方法是什么?我可以想到三个选项,但似乎没有一个很好。 选项1:不好,因为异常处理冗长而有臭味 选项2:不好,因为两次提取 选项3:不好,因为Java而不是SQL转换 关于哪种方法更好的任何建议,或者还有另一种更好的方法?并且请不要说“ Use Hibernate”,这里只限于JDB

  • 想改进这个问题吗 通过编辑此帖子,更新问题,使其只关注一个问题。 我试图理解Wait async在C中是如何工作的,有一件事让我很困惑。我知道任何使用await关键字的方法都必须标记为async。我的理解是,当命中带有await关键字的行时,该行下面的代码不会执行。启动异步操作以在等待行中执行语句,并将控件返回给可以继续执行的调用方法。 问题#1:这个假设是正确的还是wait关键字下面的代码仍在执

  • 在 C# 中,可以使用 this 关键字来表示当前对象,日常开发中我们可以使用 this 关键字来访问类中的成员属性以及函数。不仅如此 this 关键字还有一些其它的用法,下面就通过一些示例来分别演示一下。 1) 使用 this 表示当前类的对象 运行结果如下: 小牛知识库 https://www.xnip.cn/ 2) 使用 this 关键字串联构造函数 运行结果如下: 无参构造函数 小牛知识库

  • 我有一个接口服务,它有一个方法GoTo 我有一个A类,如下所示 } 我得到一个错误,说关键字“this”在当前上下文中不可用。我看过一个字段初始值设定项不能引用非静态字段、方法或属性,我可以看到错误是由于变量没有在构造函数中初始化,但在我的情况下,我这样做了。如果能帮助理解这一点,我将不胜感激?

  • 我试着看过类似的,但没有一个解决方案奏效。我以前运行的应用程序没有问题,但我的新应用程序突然开始给我带来问题。当我尝试运行它时,它总是失败: 控制台显示的内容如下:

  • 本文向大家介绍“ this”关键字在JavaScript中如何工作?,包括了“ this”关键字在JavaScript中如何工作?的使用技巧和注意事项,需要的朋友参考一下 在JavaScript中,此关键字用作引用,以引用执行的代码的对象或主题。 示例