如何使用默认移动构造函数将数据移出范围?

时间:2015-04-22 09:26:44

标签: c++ move forwarding

我想将数据移到其他范围。它似乎有用......但是对象的析构函数seems to crush application with runtime exception:

#include <iostream>
using namespace std;

struct A {
    void * data;
    A() {
        data = new char[10000];
        std::cout << "A()" << std::endl;
    }

    ~A() {
        if(data != nullptr) {
            delete [] ((char *)data);
            std::cout << "Deleted Data!" << std::endl;
        }
        std::cout << "~A() " << std::endl;
    }
};

void aDo2(A && a) {
    cout << "Do2" << endl;
}

void aDo(A && a) {
    cout << "Do" << endl;
    aDo2(A(a));
}



int main() {
    {
        A a;
       {
           aDo(move(a));
       }

        cout << "why" << endl;
    }
    cout << "here?" << endl;
    // your code goes here
    return 0;
}

如何进入其他范围才能正常工作?

1 个答案:

答案 0 :(得分:0)

当您使用new[]运算符分配内存时,必须使用delete[]运算符释放它,否则您将获得未定义的行为(这是崩溃背后最常见的原因之一)。

此外,当您移动指针时,您应该清除旧指针,因为它没有自动完成,并且可以通过sae指针为您留下两个(或更多)对象。