诡异的错误,malloc 出现问题

lanhai0859 2020-05-07 01:40:59
好无头绪的错误
////////index.h
#pragma once
using namespace std;
class Idx
{
public:
Idx();
~Idx();
};

////////index.cpp
#include "index.h"
Idx::Idx() {}
Idx::~Idx(){}

////////main.cpp
#include "index.h"
using namespace std;
typedef struct _index_node
{
shared_ptr<Idx> idx;
} IndexNode;

int main(int argc, char *argv[]) {

IndexNode *t1 = (IndexNode *)malloc(sizeof(IndexNode));

t1->idx = nullptr;

IndexNode *t3 = (IndexNode *)malloc(sizeof(IndexNode));

exit(0);
}

代码运行到IndexNode *t3 = (IndexNode *)malloc(sizeof(IndexNode));这行是报错
(gdb) bt
#0 _int_malloc (av=av@entry=0x7ffff4f95760 <main_arena>, bytes=bytes@entry=16)
at malloc.c:3415
#1 0x00007ffff4c5484c in __GI___libc_malloc (bytes=16) at malloc.c:2899
#2 0x000000000041e408 in main (argc=4, argv=0x7fffffffe378)
at /mnt/hgfs/mydev/trade/backtest/main.cpp:42


同时gdb 调试时,*p t1,出现如下waring
(gdb) p *t1
$2 = {idx = warning: can't find linker symbol for virtual table for `std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>' value
warning: can't find linker symbol for virtual table for `std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>' value
std::shared_ptr (count -184985656, weak 32766) 0x7ffff4f957d8 <main_arena+120>}

彻底傻了有谁能帮我
...全文
251 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
lanhai0859 2020-05-16
  • 打赏
  • 举报
回复
好了现在都改成new了,多谢各位
真相重于对错 2020-05-08
  • 打赏
  • 举报
回复
class A{ } class B{ A a1; } 你用new B 则.其中a1 会自动被初始化。而malloc 则 不会 <effective c++>一开始就说过,c++尽量用new delete 代替 malloc free
Vegdie 2020-05-08
  • 打赏
  • 举报
回复
new 和 delete挺不错的,vector都是用的这个,你为什么在C++论坛中问C的问题?
qybao 2020-05-07
  • 打赏
  • 举报
回复
new 会调用构造函数,malloc不会,也就是new = malloc+构造函数
我叫侯万楼 2020-05-07
  • 打赏
  • 举报
回复
参考:


class Test
{
public:
    Test()
    {
        _m = new char; /// malloc 没有调用构造函数,所以_m 是一个不确定值,析构的时候会崩溃
    }

    ~Test()
    {
        if (_m != nullptr)
        {
            delete _m; /// 这里由于野指针崩溃
            _m == nullptr;
        }
    }

private:
    char* _m;
};

int main(int argc, char *argv[])
{
    Test *t1 = (Test *)malloc(sizeof(Test));
    delete t1; /// 这里由于野指针崩溃
    exit(0);
}
我叫侯万楼 2020-05-07
  • 打赏
  • 举报
回复
t1->idx = nullptr; 调用了shared_ptr 的 ”operator=“ 但是t1->idx只是有内存,根本没有初始化,所以出错了
轻箬笠 2020-05-07
  • 打赏
  • 举报
回复
好像new的底层就是调用malloc(或者跟malloc一样的调用),既然用的C++,还是有限选new吧。
lin5161678 2020-05-07
  • 打赏
  • 举报
回复
new 会调用构造函数 malloc不会
lanhai0859 2020-05-07
  • 打赏
  • 举报
回复
引用 1 楼 真相重于对错 的回复:
c++ 尽量用new delete ,不要 malloc 和 free
为什么啊,我换成new就对了,其他地方我用的也是malloc,也没有报错,有啥内幕吗
真相重于对错 2020-05-07
  • 打赏
  • 举报
回复
c++ 尽量用new delete ,不要 malloc 和 free

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧