Trong khi triển khai lớp nhà máy, tôi gặp phải hành vi của std::auto_ptr
mà tôi không thể hiểu được. Tôi giảm vấn đề xuống chương trình nhỏ sau đây, vì vậy ... chúng ta hãy bắt đầu.Mẫu Singleton: hành vi khác nhau của auto_ptr và unique_ptr
Hãy xem xét các lớp singleton sau:
singleton.h
#ifndef SINGLETON_H_
#define SINGLETON_H_
#include<iostream>
#include<memory>
class singleton {
public:
static singleton* get() {
std::cout << "singleton::get()" << std::endl;
if (!ptr_.get()) {
std::cout << &ptr_ << std::endl;
ptr_.reset(new singleton );
std::cout << "CREATED" << std::endl;
}
return ptr_.get();
}
~singleton(){
std::cout << "DELETED" << std::endl;
}
private:
singleton() {}
singleton(const singleton&){}
static std::auto_ptr<singleton> ptr_;
//static std::unique_ptr<singleton> ptr_;
};
#endif
singleton.cpp
#include<singleton.h>o
std::auto_ptr<singleton> singleton::ptr_(0);
//std::unique_ptr<singleton> singleton::ptr_;
đây việc sử dụng một con trỏ thông minh để quản lý các nguồn lực chủ yếu quyết định bởi cần tránh rò rỉ khi thoát chương trình. Tôi sử dụng sau đó mã này trong các chương trình sau đây:
a.h
#ifndef A_H_
#define A_H_
int foo();
#endif
a.cpp
#include<singleton.h>
namespace {
singleton * dummy(singleton::get());
}
int foo() {
singleton * pt = singleton::get();
return 0;
}
main.cpp
#include<a.h>
int main() {
int a = foo();
return 0;
}
Bây giờ vui phần. Tôi biên dịch ba nguồn riêng biệt:
$ g++ -I./ singleton.cpp -c
$ g++ -I./ a.cpp -c
$ g++ -I./ main.cpp -c
Nếu tôi liên kết chúng một cách rõ ràng theo thứ tự này:
$ g++ main.o singleton.o a.o
tất cả mọi thứ làm việc như tôi mong đợi, và tôi nhận được những điều sau đây để stdout:
singleton::get()
0x804a0d4
CREATED
singleton::get()
DELETED
Nếu thay vào đó, tôi liên kết các nguồn bằng cách sử dụng thứ tự này:
$ g++ a.o main.o singleton.o
tôi nhận được kết quả này:
singleton::get()
0x804a0dc
CREATED
singleton::get()
0x804a0dc
CREATED
DELETED
tôi đã cố gắng thương hiệu khác nhau biên dịch (Intel và GNU) và các phiên bản và hành vi này là phù hợp trong số đó. Nhưng dù sao, tôi không thể thấy mã có hành vi phụ thuộc vào thứ tự liên kết.
Hơn nữa, nếu auto_ptr
được thay thế bằng unique_ptr
hành vi luôn LUÔN phù hợp với những gì tôi mong đợi là đúng.
Điều đó đưa tôi đến câu hỏi: Có ai có đầu mối về những gì đang xảy ra ở đây không?
phiên bản g ++ của bạn là gì? –
Bạn có thể muốn đọc [câu hỏi này] (http://stackoverflow.com/questions/86582/). – fredoverflow