2012-09-21 1 views
7

Xin chào, tôi đang sử dụng thư viện đã ghi đè/xóa toàn cầu mới. Nhưng tôi có một vấn đề với thư viện này, vấn đề là nó phải được khởi tạo bằng tay trong chức năng chính.Bỏ qua việc xóa/xóa toàn cầu mới

Bây giờ tôi đang cố gắng sử dụng thư viện khác khởi tạo một vài hàm trước khi gọi chính, rất tiếc thư viện này sử dụng mới trong các hàm này. Vì vậy, tôi gặp lỗi vì trình quản lý bộ nhớ sử dụng từ khóa mới/xóa đã ghi đè chưa được khởi tạo.

Tôi thực sự muốn sử dụng trình quản lý bộ nhớ mặc định vì tôi muốn thêm kiểm tra đơn vị vào thư viện này. Nó sẽ không có ý nghĩa nhiều để sử dụng bộ nhớ được sử dụng thư viện của tôi tôi muốn kiểm tra cũng được sử dụng bởi thư viện đơn vị kiểm tra của tôi.

Vì vậy, câu hỏi của tôi là nếu nó có thể bỏ qua toàn cầu ghi đè mới/xóa khi bao gồm thư viện thứ hai và chỉ sử dụng mặc định mới/xóa?

Tôi đang sử dụng studio hình ảnh 2010 trên Windows 7 với trình biên dịch C++ chuẩn.

+0

Câu trả lời sẽ phụ thuộc vào nền tảng và/hoặc biên dịch. – atzz

+0

Bạn có phát triển cả hai thư viện hoặc là bên thứ ba không? Nếu bạn đang kiểm soát mã quản lý bộ nhớ, tôi sẽ đi chệch khỏi việc ghi đè mới/xóa và tạo một đối tượng quản lý bộ nhớ * theo kiểu 'std :: tr1 :: shared_ptr'. – count0

+0

@ count0 Chúng tôi phát triển thư viện Trình quản lý bộ nhớ. Đó là một trình quản lý bộ nhớ tùy chỉnh với bộ thu gom rác được tối ưu hóa cao. Và tôi đang cố gắng sử dụng các thư viện kiểm tra tăng cường để kiểm thử đơn vị. – ProgrammerAtWork

Trả lời

0

Bạn có thể đặt khởi tạo của trình quản lý bộ nhớ ra khỏi chính vào một lib được chia sẻ không?

Nếu có thể, bạn có thể thử buộc thứ tự khởi tạo thư viện của bạn (phụ thuộc) để tải (và khởi tạo) trình quản lý bộ nhớ trước khi tải bất kỳ thứ gì khác. Tuy nhiên đây là một giải pháp rất dễ vỡ (hoặc cụ thể) vì nó sẽ phụ thuộc vào cách giải quyết cụ thể của nền tảng để buộc thứ tự trong đó các lib được chia sẻ được khởi tạo.

+0

Các từ khóa ghi đè được viết trong tệp tiêu đề vì vậy tôi không thể đặt nó trong thư viện khác và tôi thực sự muốn sử dụng trình quản lý bộ nhớ mặc định vì tôi muốn thêm kiểm tra đơn vị vào thư viện này. Nó sẽ không có ý nghĩa nhiều để sử dụng bộ nhớ được sử dụng thư viện của tôi tôi muốn kiểm tra cũng được sử dụng bởi thư viện kiểm tra đơn vị của tôi. – ProgrammerAtWork

+0

Ồ, buộc thứ tự khởi tạo với các phụ thuộc có thể hoạt động, tôi không biết ... nhưng tôi vẫn muốn sử dụng mới/xóa mặc định, vì vậy tôi có thể thêm các kiểm tra đơn vị vào thư viện mà không cần kiểm tra đơn vị. VIT lên. – ProgrammerAtWork

+0

Từ bạn câu hỏi có vẻ như bạn chỉ có một vấn đề của việc sử dụng :: mới và :: xóa trước khi quản lý bộ nhớ được khởi tạo. Nếu bạn muốn sử dụng cả hai, bạn sẽ phải gọi một cách rõ ràng mới/xóa bạn muốn kiểm tra. Nếu các nhà thiết kế thư viện không sử dụng một không gian tên cho rằng bạn có thể gặp rắc rối, vì bạn không biết họ gọi phương thức nào trong thư viện của họ. – count0

0

nếu trọng được thực hiện với một macro bạn có thể sử dụng

#pragma push_macro ("new") 
#undef new 
...code with standard new here ... 
#pragma pop_macro ("new") 

Nếu nó thực sự được thực hiện bằng chức năng ghi đè sau đó bạn có thể tạm thời xây dựng một "mới" vĩ mô cho mình mà các cuộc gọi một hàm với tên khác đặt ở những nơi khác mà chỉ cần gọi hàm chuẩn. Macro được giải quyết trước các cuộc gọi chức năng.

1

Tôi không nghĩ rằng điều này là có thể mà không sửa đổi chính thư viện. Tôi đoán nó là về một thư viện tĩnh (bên trong một dll, ghi đè mới/xóa sẽ được chỉ bởi các chức năng bên trong dll.)

Bạn có thể loại bỏ một tập tin obj từ một thư viện tĩnh bằng cách sử dụng lệnh (Visual lệnh dấu nhắc):

LIB /REMOVE:obj_to_remove /OUT:removed.lib input.lib 

để tìm hiểu những gì obj để loại bỏ, chạy đầu tiên:

DUMPBIN /ARCHIVEMEMBERS input.lib 

Bạn sẽ thấy dòng như

Archive member name at 14286: /0 compilation.dir\objfile1.obj 

14286 'xác định' tệp obj. Để xem vị trí của mỗi biểu tượng, hãy chạy:

DUMPBIN /LINKERMEMBER:1 input.lib > members.txt 

và tìm kiếm/xóa mới. members.txt sẽ chứa các tên bị cắt xén của mỗi biểu tượng và một mã định danh của obj trong đó biểu tượng này là. Ví dụ:

14286 [email protected][email protected]@[email protected]@2HB 

14286 cho bạn biết mã nhận dạng obj 'trong đó biểu tượng nằm.Nếu bạn có khó khăn khi tìm new/delete, bạn có thể chạy:

DUMPBIN /SYMBOLS input.lib > sym.txt 

mà sẽ tuôn vào sym.txt tên đọc sai và unmangled cho mỗi biểu tượng.

Cuối cùng, xóa tệp obj bằng lệnh LIB ở trên bằng cách thay thế obj_to_remove bằng compilation.dir\objfile1.obj trong ví dụ của chúng tôi và liên kết với removed.lib.

Bây giờ, nếu bạn không may mắn, các ký hiệu khác bạn cần có thể nằm trong cùng một tệp đối tượng như mới/xóa. Trong trường hợp đó, bạn có thể "hack" các lib sử dụng một cái gì đó giống như this (nói đổi tên new-dewdelete-nelete.)