2015-07-25 14 views
5

Hành vi lạ trong IOS khi tích hợp với thư viện c/C++.IOS xóa bộ nhớ được cấp phát trong thư viện gốc

Trong appdelegate tôi gọi

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0), ^{ 
    [[ABCService sharedInstance] abcInitialize]; 
}); 

abcInitialize được định nghĩa trong C++ thư viện

struct abc *top; 
top = calloc(TYPE_SERV,size_of(struct abc)); 
top->us = server_alloc (...certain_params...); 

bên trong máy chủ alloc tôi làm alloc của cấu trúc struct1struct2 Và sau đó trong Initialize chức năng i cố gắng truy cập

top->us = calloc(TYPE_US, size_of(struct us)); 
if(top->us->struct1) //do something 

tôi nhận thấy rằng struct1 của tôi luôn luôn là null

Khi tôi sửa lỗi, tôi có thể thấy rằng, công trình được phân bổ tốt và giá trị này được thiết lập một cách thích hợp, nhưng trước khi trở về từ chức năng, bộ nhớ sẽ tự động deallocated. Điều này hoàn toàn khó hiểu và gây phiền nhiễu. Có ai giúp tôi hiểu chuyện gì đang diễn ra không?

tôi đã cố gắng bằng cách tắt ARC quá, vẫn không có sự thay đổi

+0

Bạn cần hiển thị cách struct1 được phân bổ và cách nó được khai báo. – bbum

+0

stuct1 đang được phân bổ là calloc (1, stuct1_size); – blganesh101

+0

Tôi đoán bạn cần hiển thị abcInitialize: trông như thế nào. Bởi vì trong mã hiện tại của bạn, bạn không cấp phát bộ nhớ cho con trỏ 'top' nhưng gán thứ gì đó cho thành viên' us' (top-> us = ...). –

Trả lời

7
top->us = calloc(TYPE_US, size_of(struct us)); 
if(top->us->struct1) //do something 

tôi nhận thấy rằng struct1 của tôi luôn luôn là null

Nếu đó là mã thực của bạn, sau đó có, struct1 sẽ luôn là rỗng. calloc cấp phát bộ nhớ và khởi tạo bộ nhớ bằng 0. Do đó, tất cả các thành viên của các thành viên top->us sẽ bằng không và kể từ struct1 là thành viên của top->us, số điện thoại sẽ bằng 0, nghĩa là NULL.

+0

struct1 được cấp phát. Đây không phải là mã thực. Mã thực sự hoạt động trên tất cả các nền tảng và không có thay đổi nào được thực hiện cho IOS – blganesh101

4

Trước hết, ARC không liên quan gì đến việc quản lý bộ nhớ của mã C hoặc C++, vì vậy, bạn có thể loại trừ ARC để gây ra điều này.

Theo http://www.cplusplus.com/reference/cstdlib/calloc/, calloc luôn khởi tạo tất cả các bit của bộ nhớ được phân bổ tới 0, một cách tự nhiên, top-> us-> struct1 sẽ là NULL.

nhưng trước khi trở về từ chức năng, bộ nhớ sẽ tự động deallocated

Làm thế nào để bạn đi đến kết luận rằng bộ nhớ sẽ tự động deallocated? Như đã đề cập ở trên, ARC sẽ không tự động phát hành cấu trúc/đối tượng C++ của bạn.

Kết luận. Kết quả bạn thấy thực sự là như mong đợi.

+0

Khi tôi đã sửa lỗi, bộ nhớ được cấp phát tốt và tôi có thể thấy các giá trị cấu trúc còn nguyên vẹn., Khi chức năng trả về cùng cấu trúc được cấp phát. Tôi tự hỏi tại sao lại là hành vi kỳ lạ này. – blganesh101

0

Tôi đã tìm thấy sự cố và đó là do liên kết cùng một tệp hai lần từ thư viện khác nhau. Tôi đã sửa chữa các thư viện của mình và điều đó đã khắc phục được sự cố của tôi. Vì vậy, không có mã nguồn nào được cập nhật. Chỉ cần các libs đã được sửa chữa với đúng nguồn. Cảm ơn rất nhiều sự hỗ trợ của bạn.

Các vấn đề liên quan