逛奔的蜗牛

我不聪明,但我会很努力

   ::  :: 新随笔 ::  ::  :: 管理 ::

// 结点类

class Node {

public:

    Node() {

    }


    Node(int key, std::string data) : key(key), data(data) {

    }


    bool operator<(const Node &other) {

        if (key < other.key) {

            return true;

        } else {

            return false;

        }

    }


    Node& operator=(const Node &other) {

        if (this != &other) {

            key = other.key;

            data = other.data;

        }


        return *this;

    }


    friend std::ostream& operator<<(std::ostream &out, const Node &note) {

        out << "\'" << note.key << "," << note.data << "\'";

        return out;

    }


    int key;

    std::string data;

};

    // 给此结点的数组动态分配内存

    void reallocate() {

        int newCapacity = capacity * 2;

        T *tempData = new T[newCapacity];

// memcpy(tempData, data, capacity * sizeof(T)); // [[[[1]]]]

        for (int i = 0; i < capacity; ++i) {tempData[i] = data[i];}// [[[[2]]]]

        

delete[] data;

        data = tempData;

        size = capacity;

        capacity = newCapacity;

    }

Node中的std::string中的字符串是用char*来存储的。如果使用[[[[1]]]]处的memcpy,由于memcpy只是浅拷贝,简单的把Node中的std::string的char*的首地址给拷贝过来,而其中真正的字符串内容并没有复制过来,所以在delete[] data后,源Node中的std::string被释放,所以其中的字符串也被删除掉了。而在新的tempData->data->std::string.char*所指向的内容已经是无效的了,所以就出问题了。而使用[[[[2]]]]处的for循环来一个一个的复制对象,因为std::string的运算符=被重载过了,而会把其中的字符串内容也同时复制,所以就不会出现使用memcpy时出现的问题。


事实上就是一个深拷贝与浅拷贝的问题,这个错误有时不太容易被发现。

posted on 2009-12-23 19:27 逛奔的蜗牛 阅读(4258) 评论(5)  编辑 收藏 引用 所属分类: C/C++

评论

# re: C/C++: memcpy()血泪史 2009-12-23 22:01 陈梓瀚(vczh)
我觉得,太喜欢用C函数,才是很多错误的根源。=就=,不要没事memcpy,除非编译有错误。要是真的有错误了,如果那个东西是你写的,你也给补上operator=,不要memcpy。  回复  更多评论
  

# re: C/C++: memcpy()血泪史 2009-12-23 23:15 暗金装备
@陈梓瀚(vczh)
呵呵,就是想着,memcpy速度快,汗。  回复  更多评论
  

# re: C/C++: memcpy()血泪史 2009-12-24 13:00 陈梓瀚(vczh)
@暗金装备
如果你了解过x86你就会知道,其实编译器生成的operator=比memcpy更快……  回复  更多评论
  

# re: C/C++: memcpy()血泪史 2010-02-06 00:28 ddd
因为std::string的运算符=被重载过了
楼主以上观点不准确
data[i]实际上是值类型了,不是引用类型(不是内存地址,不是指针)
所以temp[i]=data[i]就相当于 char c='a'; char d=c;
在这里=是标准的赋值符号,没有重载  回复  更多评论
  

# re: C/C++: memcpy()血泪史 2010-11-21 13:09 李现民
@陈梓瀚(vczh)
这是为什么? 好像stlport中std::string的operator= 就是用memcpy实现的吧  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理