新的[]*字符是否可以被删除[](ed)

Can a new[] *char be delete[](ed)?

本文关键字:删除 ed 字符 是否 新的      更新时间:2023-10-16

是否有任何方法可以释放*data在此代码中使用的内存?

#include <iostream>
#include <stdlib.h>
using namespace std;
class mstring {
public:
    char *data;
    int length;
    mstring::mstring()
{
    length = 8;
    data = new char[length];
    data = "UNKNOWN";
    cout << "In mstring default ctor" << endl;
}
mstring::~mstring()
{
    delete[] data;
    cout << "In mstring dtor" << endl;
}
};
int main() {
    mstring a;
    cout << a.data;
}

当试图删除"UNKNOWN"时代码崩溃

您的问题在于以下代码:

data = new char[length];
data = "UNKNOWN";

首先,创建一个新的字符数组,在下一个语句中,通过使用存储在可执行文件中的字面值字符串"UNKNOWN"的地址覆盖它,您将失去对它的唯一锚点。

当你在析构函数中结束时,你是在试图删除可执行文件的内存,因为你不再引用分配的内存。

由于你不能使用std::stringstrcpy,我猜你必须自己写:

auto fixedUnknownString = "UNKNOWN";
assert(fixedUnknownString[length] == ''); // Lucky coinsidence, extra code required if we wouldn't have an exact match
for (std::size_t i = 0; i < length; ++i) {
    data[i] = fixedUnknownString[i];
}