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 我本意是验证下虚函数的调用,没想到出了这个问题,谢谢啦,我明白了
2 年多之前 回复
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*”。。
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C++ error C2440: “类型转换” : 无法从“std::vector::iterator”转换为“PPkgHead”
圆环套圆环之迭代器 话说这一日是风平浪静,万里乌云,俺的心情好的没得说,收到命令清理A区(写部分代码,其中有在VC6下己完成的代码要移植到VC7下),一路上很轻松,用‘饭得标’的话来说就是‘卡卡’地!在快完成时出现错误。error C2440: “类型转换” : 无法从“std::vector::iterator”转换为“PPkgHead”        with        [  
CString使用GetBuffer转换成std::string类型失败 原因
cstr.GetBuffer(cstr.GetLength()); 但是编译时会出现如下错误: error C2440: “初始化”: 无法从“wchar_t *”转换为“std::basic_string”   解决方法: 把工程属性中的字符串模式 改为 ANSI 模式编译,如Use Multi-Byte Character Set。貌似新建应用程序默认用的是UNICODE编译。
解决error C2440: “初始化”: 无法从“std::_List_const_iterator<_Mylist>”转换为“std::_List_iterator<_Mylist>”
学习C++时,当使用vector、list的常量做为某函数的参数时, 如 void ListPrint(const list &lt) { list::iterator iter = lt.begin(); while(iter != lt.end()) { cout << *iter << endl; } }会报如下错误 error C2440: “初始化”: 无法从“std:
error C2440: “类型转换” : 无法从“overloaded-function”转换为
原因:线程函数需要静态成员函数或全局函数 class foo {   DWORD work_thread(PVOID args); }; 1)因为foo类没有实例化,不能直接调用里面的函数,需要将其声明为静态成员函数 class foo {
error C2440: “初始化”: 无法从“StructOne *(*)[10]”转换为“StructOne *[9][10]”
按条件返回数组引用: StructOne * (arrS)[9][10] = bIs ? arr1: arr2; 这是一句合法C++代码,在安卓NDK和XCODE下都编译运行正常,但是VS2005里编译错误: : error C2440: “初始化”: 无法从“StructOne *(*)[10]”转换为“StructOne *[9][10]”         没有转换为数组类
C++中error C2440: “=”: 无法从“void *”转换为“graph_node **”
使用显示转换static_cast<>就能解决。
error C2440: “static_cast”: 无法从“void (__thiscall CVCadView::* )(int)”转换为“void (__thiscall CCmdTarget
项目从vc6.0升级到用vs2013编译,遇到了一些问题 1."fabs": 对重载函数的调用不明确 2.error C2593: “+=”不明确 3.for循环int i的声明要放到外边 4.如题 要解决这个问题其实很简单,开始百度了一下,解决方案大都是: { 1、VC6中,说可以把函数在头文件中定义为: afx_msg void OnProgress()这样 但是在VS2005
error C2440: “初始化”: 无法从“void *”转换为“box *”
报错代码修改其他类似。
error C2440: “static_cast” : 无法从“void (__thiscall CMainFrame::* ) (NMTOOLBARA *,LRESULT *)”转换为“void
将一个项目由vc6转 到vc7下面,ON_NOTIFY的NMTOOLBAR老是提示错误 error C2440: “static_cast” : 无法从“void (__thiscall CMainFrame::* ) (NMTOOLBARA *,LRESULT *)”转换为“void (__thiscall CCmdTarget::* ) (NMHDR *,LRESULT *)” 
error C2440: “初始化”: 无法从“wchar_t *”转换为“ATL::CStringT<BaseType,StringTraits>”
在使用MFC编译代码时出现下面的情况: BOOL BCMenu::ModifyODMenuW(wchar_t *lpstrText,wchar_t *OptionText, int nIconNormal){ BCMenuData *mdata; // Find the old BCMenuData structure: CString ju