“operator char *”问题

时间:2010-08-11 19:09:24

标签: c++

下面的代码预计打印“​​kevin” 但是,这是打印垃圾的价值。我已经检查了调试器。 “operator char *”调用返回的指针无效。有什么想法吗?

class Wrapper
{
private:
    char* _data;

public:

    Wrapper(const char* input)
    {
        int length = strlen(input) + 1;
        _data = new char[length];
        strcpy_s(_data, length, input);
    }

    ~Wrapper()
    {
        delete[] _data;
    }

    operator char*()
    {
        return _data;
    }
};

int main()
{
    char* username = Wrapper("kevin");
    printf(username);
    return 0;
}

4 个答案:

答案 0 :(得分:15)

问题是你的Wrapper对象被构造为临时对象并立即被销毁。通过operator char*,您将返回指向Wrapper对象在被销毁时已被删除的内存的指针。

使其有效:

Wrapper wrapper("Kevin");
char* username = wrapper;

答案 1 :(得分:4)

这一行:

char* username = Wrapper("kevin");

创建一个无名的Wrapper对象,该对象立即被销毁,让指针指向任何东西。您需要为包装器对象指定名称,或者不要编写类似的代码。这可行:

Wrapper w("kevin");
char* username = w;
printf( "%s", username );

答案 2 :(得分:4)

在第一个语句结束时 - 在printf之前,Wrapper析构函数超出范围时,正在返回的指针将被删除。 在某些情况下,可以掩盖此错误,因为内存可能无法立即回收,并且值“看起来”正常,即使它不再有效。有些工具可以帮助检测这一点。

答案 3 :(得分:1)

此语句创建一个临时Wrapper对象:

char* username = Wrapper("kevin");

在语句结束时,(“完整表达式”)Wrapper对象被破坏。你留下了一个悬垂的指针(即它指向的东西已被删除)。

将指针(或引用)返回到对象的内部数据通常很危险,应该在合理的情况下避免使用。在任何情况下,您认为世界上没有足够的字符串类吗?你真的需要写另一个吗?