0

下面的类将使用成员变量newTodayTaskString( string) 启动。

销毁对象时,我喜欢删除字符串,但是在编译项目时,我收到一条指向析构函数删除行的错误消息:

删除:std::string 无法转换为 void

班级:

class TodayTask {
private:   
    string newTodayTaskString;

public: 
    TodayTask (string t) : newTodayTaskString (t){}

    // Destr.
    ~TodayTask () {
        delete newTodayTaskString;
    }

    string getTodayTaskString () const {
        return newTodayTaskString;
    }
};
4

7 回答 7

4

delete必须给定一个指针,并且只能用于销毁用 . 创建的对象new

在这种情况下,对象是类成员,因此会自动销毁。你不需要在析构函数中对它做任何事情。

于 2012-07-05T10:54:37.767 回答
3

在 C++ 中,内存可以自动或手动分配。如果你定义一个简单的变量,它的内存会自动分配在Stack中。然后自动释放内存。例如:

void foo()
{
    std::string s;//memory is allocated here
}//the variable only lives inside the function, so at this point the memory is freed

第二种方法是使用操作符 new手动分配内存,如下所示:

void foo()
{
    int * i = new int();//we allocate the memory for our variable here.
}

在这里,内存分配在堆中,它不会在函数结束时或其他任何地方自动释放,直到您的程序结束。在这种情况下,您需要调用operator delete,但您只能为每个变量调用一次:

void foo()
{
    int * i = new int();
    <...some code...>
    delete i;//we free the memory at this point.
}

请注意,如果您尝试删除相同的变量两次,您可能会遇到分段错误。

在您的情况下,您尝试手动删除尚未手动为其分配内存的变量,这会导致错误。在您的情况下,您不需要使用析构函数,一切都会自动完成。

于 2012-07-05T10:52:42.050 回答
2

您应该delete仅在使用创建它时使用new

于 2012-07-05T10:49:05.400 回答
2

delete仅在使用 . 创建对象时才需要new。在这种情况下,您的对象会在构造函数之前自动创建,因为它是一个成员变量。因此,在调用析构函数后它会自动销毁。

于 2012-07-05T10:54:37.123 回答
1

您不会“删除”newTodayTaskString,因为它还没有被分配“new”。它是一个成员变量——它会被自动构造和销毁,你不需要做任何事情。

于 2012-07-05T10:47:33.657 回答
0

您不需要删除newTodayTaskString,因为分配内存的不是您

于 2012-07-05T10:47:42.687 回答
0

你真的不必删除字符串。它不是动态分配的。

只要记住这一点:当你新的东西时使用删除。当你新建一个数组时使用 delete[] 。

于 2012-07-05T11:09:32.327 回答