Tôi đang sử dụng boost :: make_shared lần đầu tiên để tạo các đối tượng được trỏ đến bởi các con trỏ được chia sẻ. Chủ yếu là vì mã của chúng tôi quá chậm và phân bổ đơn lẻ thực sự giúp cải thiện hiệu suất.boost :: make_shared không gọi điện thoại (vị trí) nhà điều hành mới?
Sau khi sửa lỗi rò rỉ bộ nhớ "Tôi đã quyết định triển khai bộ dò tìm rò rỉ bộ nhớ đơn giản bằng cách ghi đè toán tử mới cho tất cả các lớp liên quan chỉ để đếm đối tượng nào vẫn còn sống tại các điểm cụ thể trong ứng dụng của chúng tôi. Tôi đã thực hiện điều này nhiều lần trước đây và đã rất ngạc nhiên khi thấy mã của tôi không còn phát hiện bất kỳ đối tượng nào.
I figured rằng tất cả những gì phải làm là ghi đè lên "vị trí mới" thay vì các nhà điều hành "bình thường" mới vì những điều sau đây từ tài liệu trang web thúc đẩy cho make_shared:
"Effects: bộ nhớ Phân bổ phù hợp đối với một đối tượng kiểu T và xây dựng một đối tượng trong nó thông qua vị trí biểu thức mới mới (pv) T() hoặc mới (pv) T (std :: forward (args) ...). sử dụng bản sao của bộ nhớ để cấp phát bộ nhớ. Nếu ngoại lệ được ném, không có hiệu lực . "
Vị trí mới của tôi cũng không được gọi. Tôi đã viết một chương trình thử nghiệm nhỏ để tạo lại hành vi:
#include <iostream>
using namespace std;
#include "boost/shared_ptr.hpp"
#include "boost/make_shared.hpp"
class Test
{
public:
Test() { cout << "Test::Test()" << endl; }
void* operator new (std::size_t size) throw (std::bad_alloc) {
cout << "Test new" << endl;
return malloc(size);
}
void* operator new (std::size_t size, const std::nothrow_t& nothrow_constant) throw() {
cout << "Test non-throwing new" << endl;
return malloc(size);
}
void* operator new (std::size_t size, void* ptr) throw() {
cout << "Test non-throwing placement new" << endl;
return malloc(size);
}
};
void* operator new (std::size_t size) throw (std::bad_alloc) {
cout << "Global new" << endl;
return malloc(size);
}
int main() {
cout << "..." << endl;
boost::shared_ptr<Test> t1(boost::make_shared<Test>());
cout << "..." << endl;
boost::shared_ptr<Test> t2(new Test());
cout << "..." << endl;
return 0;
}
nào làm cho đầu ra sau đây:
...
Global new
Test::Test()
...
Test new
Test::Test()
Global new
...
tôi đã mong đợi "Thử nghiệm phi ném vị trí mới" trên dòng thứ 3 của đầu ra. Bạn nghĩ hành vi nên như thế nào? Bạn có đồng ý rằng theo tài liệu của make_shared nó nên gọi vị trí điều hành mới của lớp Test của tôi? Hay tôi hiểu sai?
Tôi có thể sao chép triển khai tăng cường cục bộ và thêm cuộc gọi vào nhà điều hành vị trí mới của khóa học. Nhưng, điều đó có phù hợp không, hoặc nó có vi phạm các ngữ nghĩa dự định của vị trí mới không?
Cảm ơn trước về thời gian và sự trợ giúp của bạn.
Bằng cách nhìn vào của boost, nó đang sử dụng toán tử mới vị trí toàn cục :: new (pv) T(). Đó là lý do tại sao vị trí cấp lớp của bạn không được gọi ... Bằng cách loại bỏ vòng loại toàn cầu '::' trước khi mới, hàm make_shared thực sự gọi trình điều khiển vị trí cấp lớp mới của bạn. –
Gob00st