[2018年5月2号]C++ primer 课后练习 第十二章 动态内存

12.6

vector<int >* createVec(){
    return new vector<int>;
}


void getCinToVectore(istream& in, vector<int >& vec){
    int i = 0;
    while (in >> i)
    {
        vec.push_back(i);
    }
}


void printElements(const vector<int >& vec) {
    for(auto vecE : vec){
        cout << vecE << endl;
    }
    delete &vec;
}

int main() {
    vector<int > * vecPoint = createVec();
    getCinToVectore(cin, *vecPoint);
    printElements( *vecPoint);
    for (;;);
    return 0;
}

12.7

shared_ptr<vector<int >> createVec(){
    return make_shared<vector<int >>();
}


void getCinToVectore(istream& in, vector<int >& vec){
    int i = 0;
    while (in >> i)
    {
        vec.push_back(i);
    }
}


void printElements(const vector<int >& vec) {
    for(auto vecE : vec){
        cout << vecE << endl;
    }
}

int main() {
    shared_ptr<vector<int >>  vecPoint = createVec();
    getCinToVectore(cin, *vecPoint);
    printElements( *vecPoint);
    for (;;);
    return 0;
}

12.8

函数中申请了一块动态内存,却没有释放他,在函数结束后程序将无法释放这块内存,会导致内存泄漏

12.9

动态内存 new int(100)在r=q之后,这块内存将无法释放,会导致内存泄露,

动态指针在r2=q2时候,自动释放make_shared<int>(100)的内存

12.10

正确

12.11

不正确,在process函数结束之后,p指针会被释放,导致空悬指针

12.12

a.传入一个sp,合法传入

b.不合法,不能将内置指针隐式转换成智能指针

c.同上不合法,p是一个内置指针

d.合法,传入了一个临时的智能指针

12.13

sp和p同时指向了同一块指针,当p被释放时,sp也会被释放,但是智能指针仍然存在,当sp使用结束(即使使用时就已经是空悬指针),那块内存会再次被释放,当再次使用sp或退出sp当前作用域时候都会抛出异常

12.14

struct destination;
struct connection;
connection connect(destination*);
void disconnect(connection);
void end_connection(connection* p){
    disconnect(*p);
}
void f(destination& d){
    connection c = connect(&d);
    shared_ptr<connection >(&c, end_connection);
}

12.15

struct destination;
struct connection;
connection connect(destination*);
void disconnect(connection);
void end_connection(connection* p){
    disconnect(*p);
}
void f(destination& d){
    connection c = connect(&d);
    shared_ptr<connection >(&c, [](connection* c_p){disconnect(*c_p);});
}


猜你喜欢

转载自blog.csdn.net/qq_22478401/article/details/80161511