新的[] * char可以删除[](ed)吗?

时间:2016-08-21 16:33:45

标签: c++

有没有办法释放*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;
}

代码在尝试删除时崩溃为&#34; UNKNOWN&#34;无法删除。

1 个答案:

答案 0 :(得分:2)

您的问题在于以下代码:

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

首先,创建一个新的char数组,在下一个语句中,通过用可存储在可执行文件中的文字字符串“UNKNOWN”的地址覆盖它,松开它的唯一锚点。 / p>

当你最终进入析构函数时,你试图删除可执行文件的内存,因为你不再引用已分配的内存。

由于您无法使用std::stringstrcpy,我猜您必须自己编写:

auto fixedUnknownString = "UNKNOWN";
assert(fixedUnknownString[length] == '\0'); // 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];
}