gpt4 book ai didi

c++ - 将我的字符保留在范围内并进行处理

转载 作者:行者123 更新时间:2023-11-28 00:56:45 24 4
gpt4 key购买 nike

我有一个函数可以将相对路径(例如“log\crash.txt”)转换为完整路径(例如“E:\Program\log\crash.txt”)。函数是:

string_t GetAbsPath(string_t relPath)
{
char abs[1024];

//Get the working directory
GetCurrentDirectory(1024, abs);

#pragma warning(disable:4996)
//Add a slash and content folder
memcpy(&abs, strcat(abs, "\\content\\"), 1024);
//Append it to the relative path
memcpy(&abs, strcat(abs, relPath.c_str()), 1024);
#pragma warning(default:4996)

return abs;
}

string_t 是我编写的一个类,它基本上是 const char* 的包装器。我的问题是,(我有点预料到这一点......)是当函数返回时,abs 超出范围,而 string_t 获取返回值现在是空的/垃圾。在这种情况下,我通常只使用 memcpy 将其复制到一个不会超出范围的指针中。但问题在于,该指针(即 string_t 中的 const char*)需要被delete[]string_t 没有以析构函数开头。我可以写一个然后在那里 delete[] 它,但这会带来另一个问题:

如果我像这样创建一个 string_t:

string_t crash = "New[] isn't called! Ahh!";

当我在析构函数中转到 delete[] 时,程序将崩溃,因为从未调用过 new[]。

我可以在调用 GetAbsPath 的函数中delete[] const char*,如下所示:

void LoadModel(string_t relPath)
{
string_t fullPath = GetAbsPath(relPath);
. . .
delete[] fullPath.c_str();
}

但我知道如果我稍后再回到代码,我会说“为什么那个 delete[] 在那里”,或者我会在不需要的时候添加它......好吧,指针是,那里有很大的错误空间。

我该怎么做才能将该 char 保留在范围内(我猜这只能用指针来完成),并确保清理分配的内存?必须有一种方法,因为 std::string 保持一切干净,并且它具有连接等功能,这是我的 string_t 甚至没有的功能。我很感激这里的任何帮助,因为我不知所措......

最佳答案

你有三个选择:

1) 决定 string_t 将始终拥有它指向的字符串,并且它将负责释放它。让构造函数分配/复制。

2) 决定 string_t 永远不会拥有它指向的字符串,调用它的代码将始终负责在必要时释放它。

3) 确定 string_t 将支持这两种模型,并且需要一个标志来决定是否在其析构函数中调用 free[]。调用代码必须告诉 string_t 是分配/复制还是只存储指针。

确保遵循rule of three .或者更好的是,只需使用始终采用选项 1 的 std::string,因此您可以放心地使用它。

关于c++ - 将我的字符保留在范围内并进行处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10788832/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com