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

How to be able to move data out of scope using default move constructor?

本文关键字:数据 移出 范围 构造函数 何使用 默认 移动      更新时间:2023-10-16

我想将数据移动到其他范围内。它似乎有效...然而,对象的析构函数似乎会因运行时异常而破坏应用程序:

#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;
}

如何使移动到其他范围才能正常工作?

当您使用

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

此外,当您移动指针时,您应该清除旧指针,因为它不是自动完成的,并且可能会在 sae 指针中留下两个(或更多)对象。