2 young111111234 Young111111234 于 2016.03.23 16:06 提问

C2440: “delete”: 无法从“std::string”转换为“void*”

#include "stdafx.h"
#include
#include
using namespace std;
class A
{
public:
virtual ~A()
{
cout << "call A::~A()" << endl;
}
};
class B :public A
{
public:
B(int i)
{
buf =new char[i];
}
virtual ~B()
{
delete[]buf;

cout << "call B::~B()" << endl;
}
private:
string buf;
};
void fun(A* a)
{
delete a;
}
int main()
{
A* a = new B(10);
fun(a);
return 0;
}
编译后产生的错误
2 IntelliSense: 表达式必须包含指针类型
1 error C2440: “delete”: 无法从“std::string”转换为“void*”

当注释掉 delete[]buf 一行 ,能够编译通过。。。
这是为什么,不理解错误提示,求大侠帮忙看看。

2个回答

qq423399099
qq423399099   Ds   Rxr 2016.03.23 16:49
已采纳

直接new一个string不就好了,楼主究竟是要干嘛?

 class B :public A
{
public:
    B(int i)
    {
        buf =new string();
    }
    virtual ~B()
    {
        delete buf;

        cout << "call B::~B()" << endl;
    }
private:
    string *buf;
};
Young111111234
Young111111234 我本意是验证下虚函数的调用,没想到出了这个问题,谢谢啦,我明白了
一年多之前 回复
qq423399099
qq423399099   Ds   Rxr 2016.03.23 16:18

楼主将string buf;改为char *buf; (改成char *指针才对啊,然后new和delete,你对一个string类型的对象去delete....)

Young111111234
Young111111234 按照你的建议,编译运行是成功的。但 buf =new char[i];这一句都是正确的,可以动态申请char类型的内存赋给string对象, 那么用delete删除应该是没问题的啊。并且我不明白“delete”: 无法从“std::string”转换为“void*”。。
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!