我有一个CName对象的指针数组.我有以下构造函数初始化我的数组大小一.然后,当我添加一个对象时,我将数组增加1并添加新对象.编译很好,但是当我尝试打印它时,我只是得到分段错误错误.你能看看我是否做错了吗?
//constructor
Names_Book::Names_Book()
{
grow_factor = 1;
size = 0;
cNames = (CName**)malloc(grow_factor * sizeof(CName*));
cNames[0] = NULL;
}
void Names_Book::addCName(CName* cn)
{
int oldSize = size;
int newSize = size + 1;
CName** newCNames = (CName**)malloc(newSize * sizeof(CName*));
for(int i=0; i<newSize; i++)
{
newCNames[i] = cNames[i];
}
for(int i=oldSize; i<newSize; i++)
{
newCNames[i] = NULL;
}
/* copy current array to old array */
cNames = newCNames;
delete(newCNames);
size++;
}
Run Code Online (Sandbox Code Playgroud) 我有一个问题,即发布视图的次数太多了.虽然理论上很简单,因为我将uiview移动到uiview,这是uiview的一个子类,并且是动画的,所以它不是我可以轻松修复的东西.它只会在一定条件下崩溃10%,即使在这些条件下也只有30%的时间.
换句话说,它有点复杂.有时在我的dealloc方法中,此UIView的保留计数已经为1(在视图发布时会释放),因此不应再次释放.所以我做的是这样的:
if ([mainView retainCount] > 1) {
NSLog(@"released");
[mainView release];
}
Run Code Online (Sandbox Code Playgroud)
与发布的崩溃一致通常被称为,但并非总是如此,并且当我有时期望它崩溃时它几乎发生.我用这个代码检查了泄漏,它从不泄漏.
现在实际的问题......由于保留计数而释放一些东西是错误的吗?我已经尝试了许多不同的方法来解决这个问题,到目前为止,这是唯一可靠且无泄漏的方法.
编辑:如果没有,那么将一个UIView复制到另一个UIView的更好方法是什么?
mainView = newView;
[newView release];
Run Code Online (Sandbox Code Playgroud)
我尝试先释放mainView,然后在newView上调用copy,但这会崩溃.以上也很有效,除非保留计数有时比预期低1,即使它从未在代码中释放任何其他内容.
哪些对象,变量变量,临时变量都存储在java中?它们是如何被引用的?我知道方法存储在堆栈中.变量存储堆或堆栈的位置?
我对内存管理有点失落.我已经读过你应该在你分配的时候发布.但是当你得到一个没有alloc的实例时,你就不应该发布.
这种情况怎么样,只需要知道我是否正确编码.我仍然是iphone dev的新手.
我有一个CustomerRepository类,它有一个方法
- (MSMutableArray *) GetAllCustomers() {
MSMutableArray *customers = [[MSMutableArray alloc] init];
Customer *cust1 = [[Customer alloc] init];
cust1.name = @"John";
Customer *cust2 = [[Customer alloc] init];
cust2.name = @"Tony";
[customers addOjbect:cust1];
[customers addOjbect:cust2];
[cust1 release];
[cust2 release];
return customers;
}
Run Code Online (Sandbox Code Playgroud)
然后我有一个UIViewController
- (void) LoadCustomers() {
CustomerRepository *repo = [[CustomerRepository alloc] init];
MSMutableArray *customers = [repo GetAllCustomers];
// Iterate through all customers and do something
[repo release];
}
Run Code Online (Sandbox Code Playgroud)
所以在这种情况下...... MSMutableArray永远不会被释放?它应该在哪里发布?
我在for循环中创建了一个数组,但我无法释放它.它显示内存泄漏.这是我的代码:
for(int i = 0; i < [magArr count]; i++)
{
Magazine *magObj = [magArr objectAtIndex:i];
NSMutableArray *myArray = [data readEditions:[magObj.magazineID intValue]:0];//returns a array
}
[myArray release]; // memory leaks (retain count to -1)
Run Code Online (Sandbox Code Playgroud)
如果我也使用自动释放,它显示内存泄漏.如何解决这个漏洞?
你能看看我的代码吗:
(void)loadContactsFromAddressBook {
ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook);
CFIndex count = ABAddressBookGetPersonCount(addressBook);
ABRecordRef person;
for (int i = 0; i < count; i++) {
person = CFArrayGetValueAtIndex(allPeople, i);
CFStringRef cfStr = ABRecordCopyValue(person, kABPersonFirstNameProperty);
NSString* firstName = (NSString*) cfStr;
[contacts addObject:firstName];
CFRelease(cfStr);
}
CFRelease(addressBook);
CFRelease(allPeople);
}
Run Code Online (Sandbox Code Playgroud)
我在for block之后尝试了CFRelease(person),但是应用程序崩溃了"EXC_BAD_ACCESS".如果我删除CFRelease(人),该应用程序工作.
我正在尝试使用simpleXML在php中解析一个中等大小的XML文件(6mb).该脚本从XML文件中获取每条记录,检查它是否已经被导入,如果没有,则将该记录更新/插入到我自己的数据库中.
问题是我经常遇到超出内存分配的致命错误:
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 256 bytes) in /.../system/database/drivers/mysql/mysql_result.php on line 162
Run Code Online (Sandbox Code Playgroud)
我通过使用以下行来增加最大内存分配来避免该错误(从此处开始提示):
ini_set('memory_limit', '-1');
Run Code Online (Sandbox Code Playgroud)
然而,然后我遇到60秒的最大执行时间,并且,无论出于何种原因,我的服务器(Mac OS X上的XAMPP)都不会让我增加那个时间(如果我尝试包含脚本,脚本就不会运行像:)这样的一行
set_time_limit(240);
Run Code Online (Sandbox Code Playgroud)
然而,这一切似乎都非常低效; 我不应该能够打破文件的顺序并按顺序处理它吗?在下面的控制器中,我有一个计数变量($ cycle)来跟踪我所在的记录,但我无法弄清楚如何实现它仍然不需要处理整个XML文件.
控制器(我正在使用CodeIgniter)具有以下基本结构:
$f = base_url().'data/data.xml';
if($data = file_get_contents($f))
{
$cycle = 0;
$xml = new SimpleXMLElement($data);
foreach($xml->person as $p)
{
//this makes a single call to db for single field based on id of record in XML file
if($this->_notImported('source',$p['id']))
{
//various process here, mainly breaking up the data …Run Code Online (Sandbox Code Playgroud) 如果我通过:: operator new(nbytes)分配了一些内存,后来我在这个池中通过"new(where)what"构建了一些相应类型的objs(但是小于nbytes),有没有办法检查未初始化的内存在哪里开始?
例
struct T{};
short noOfObj = 10;
T* p = static_cast<T*>(::operator new(sizeof(T) * noOfObj));
for (short i = 0; i < (noOfObj - 2); ++i)//here I'm constructing two less obj than available mem
{
new (p + i) T();
}
Run Code Online (Sandbox Code Playgroud)
我怎么能检查(不知道noOfObj已经减少了多少)p指向的未初始化内存开始了?(觉得我再次搞砸了语法,但我担心我现在能做的最好)
考虑以下情况:
Class** array = new Class*[8];
array[1] = new Class(1,2);
Run Code Online (Sandbox Code Playgroud)
只是做" delete[ ] array足够"或者我应该在前者之前加上" delete array[1]".我对内存管理并不完全满意.
我正在开发一个32位的Windows应用程序,偶尔会耗尽内存(2GB的虚拟地址空间).当我看看如何使用WinDbg或VMMap分配虚拟内存时,我注意到一个dll映像占用了85 MB的虚拟内存空间.具体来说,84 MB是在".data"部分,并具有"写入时复制"保护.但是,当我查看硬盘时,dll只有81 KB.
dll映像如何在虚拟地址空间中比在磁盘上大1000倍?请注意,我只询问"图像",而不是堆或堆栈,或映射内存,只是图像 - 我意识到堆,堆栈,映射内存等当然会是额外的.