Miracle-s 发表于 2015-6-9 13:03:50

有关string的问题,大家看看,谢谢

#include <iostream>
using namespace std;
#include <string>
using namespace std;


struct Data
{
      string str;
};

struct Node
{
      Data data;
      Node * NextNode;
};

bool Init_Node(Node * & e)
{
      e=(Node *)malloc (sizeof( Node));
      if (e==NULL)
                return false;
      else
      return true;
};

void main()
{

                Node E;
      cin>>E.data.str;
      cout<<E.data.str;
      
      //这里可以///////////////////////

      Node * e;
      e=NULL;
      if(Init_Node( e))
      {
                cout<<e;
      cin>>e->data.str;      //这里为什么会崩溃
      cout<<e->data.str;
      }
}



不要动态分配
就用 Node * e;
cin>>e->data.str;
就会崩溃

ryxcaixia 发表于 2015-6-9 13:03:51

本帖最后由 ryxcaixia 于 2015-6-9 13:36 编辑

struct Data
{
        string str;
};

struct Node
{
        Data data;
        Node * NextNode;
};

bool Init_Node(Node * & e)
{
//e=(Node *)malloc (sizeof( Node));
        e = new Node;
        if (e==NULL)
                return false;
        else
                return true;
};

void main()
{


        Node * e;
        e=NULL;
        if(Init_Node( e))
        {
                cout<<e;
                cin>>e->data.str;      
                cout<<e->data.str;
        }
}
主要原因是并没有对string类型进行初始化就直接使用
楼主不要着急说不是已经malloc了么, 往下看
1. string是一个类, 并不是基础类型, 他有自己的构造函数和析构函数, 静态定义变量就不说了, 动态变量为什么不成功?因为他的构造函数没有执行起来

2. malloc和new的区别
具体可以看看林锐的高质量c和c++编程有一章节专讲这个, 这里我简单说说(其实他书上说的也就是我说的这些)
如果除了malloc返回一个void*, 和new会自动只能返回申请类型外
最大的一个区别是
malloc仅仅申请sizeof()大小的内存块, 然后就什么都不管了
new则会依次执行结构体(类)内的每一个成员的构造函数, 换句话说, 如果都是内置类型的变量, 那么malloc和new没啥太大差别
但是包含了非基础类型, 那么申请内存就要用new, 因为malloc不会帮你执行构造函数但是new会
举个例子
struct student
{
        string Name;
        string Number;
        string Age;
        string Class;
        string EnjoyGame
        string GirlFriend;
        string GirlFriendName;
        string GirlFriendNumber;
        string GirlFriendAge;
        string GirlFriendClass;
        string GirlFriendEnjoyGame
};

一个结构体, 里面包含十个string类型
malloc一下仅仅会得到一个内存大小为360字节的内存堆(一个string站36个字节), 然后malloc就撒手不管了

new一下, 先是得到了360字节的内存块, 然后会依次执行十次string类的构造函数

同理, 释放的时候不能用free, free一下是把这个指针指向的内存干掉了, 但是里面的很多东西并没有清理干净
此时要用delete释放, 一次delete, 则会依次执行10次string类的析构函数

ps: 楼主又是你哈! 我又来骗鱼币了

Miracle-s 发表于 2015-6-9 13:37:45

ryxcaixia 发表于 2015-6-9 13:29
struct Data
{
        string str;


高,实在是高;哈哈;我慢慢深入;
你还记得我;哈哈
我也是说怎么又是你;
只有你回复:handshake

Miracle-s 发表于 2015-6-9 13:39:13

ryxcaixia 发表于 2015-6-9 13:03
struct Data
{
        string str;


想要鱼币,我多的是,以后慢慢给你,哈:lol:

ryxcaixia 发表于 2015-6-9 13:53:22

:lol:C/C++ 语法复杂 博大精深 一起努力

Miracle-s 发表于 2015-6-9 16:31:20

ryxcaixia 发表于 2015-6-9 13:53
C/C++ 语法复杂 博大精深 一起努力

我加你好友了,接受一下呗:big

ryxcaixia 发表于 2015-6-9 16:43:21

Miracle-s 发表于 2015-6-9 16:31
我加你好友了,接受一下呗

我也想啊 但是! 说权限不够 努力签到中 要到下一级别才可以

Miracle-s 发表于 2015-6-9 18:27:32

ryxcaixia 发表于 2015-6-9 16:43
我也想啊 但是! 说权限不够 努力签到中 要到下一级别才可以

努力吧,我是个bug,:lol:
页: [1]
查看完整版本: 有关string的问题,大家看看,谢谢