我刚开始玩C++(熟悉其他语言),我想知道一些事情.
在创建动态大小的数组时,例如使用new时,为什么它在超出范围时不会被删除,但是具有固定大小的数组会被删除?
例如,使用以下代码:
int foo()
{
int baz[5]; // Gets removed out of scope
int *bar = new int[5]; // Does not get removed, becomes a leak
}
Run Code Online (Sandbox Code Playgroud)
由于baz和bar都是指向数组开头的指针,因此"运行时环境"不能应用相同的技术(检测是否超出范围,并将其删除时)应用于具有固定大小的事物动态大小?
它不能做这样的事情有什么不同.
-(void)showLog
{
NSMutableString* msgStr = nil;
msgStr = [NSMutableString stringWithFormat:@"%s","Log :"];
//show Log
[msgStr release];
}
Run Code Online (Sandbox Code Playgroud)
这是我的代码.我经常从一个线程调用这个函数.我已经禁用了ARC,我正在使用xcode 5中的iOS 7测试iPad Mini,在XCode 5中,它显示了连续的内存分配.即使我发布了这个,msgStr为什么它会显示内存分配的增量?
任何帮助或建议都会很棒.
有人可以解释为什么跟随我的代码崩溃吗?在foo方法中的块内发生崩溃。我有EXC_BAD_ACCESS或“对象错误:双重释放”。当我将“启用僵尸对象”设置为“开”时,我还收到了“-[NSObject description]:消息发送到已释放实例”。
@interface ViewController ()
@property (nonatomic, strong) NSObject *obj;
@end
@implementation ViewController
// just adding button
- (void)viewDidLoad {
[super viewDidLoad];
UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem];
[btn setTitle:@"test" forState:UIControlStateNormal];
btn.frame = CGRectMake(100, 100, 100, 100);
[btn addTarget:self action:@selector(btnAction:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
}
// fired by button
- (void)btnAction:(id)sender {
for (int i = 0; i < 100; i++) {
[self foo];
}
}
// I want to understand this method
- (void)foo {
NSLog(@"foo");
self.obj = NSObject.new;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), …Run Code Online (Sandbox Code Playgroud) 好的,我真的很想找到这个.我是Objective-C的新手,并且没有足够的指针管理经验.我知道这里有一个重要的内存泄漏,因为多次执行此代码会导致一堆内存警告,但找不到它或如何解决它.
下面的方法从固定数组中获取一些数据并从中创建一组图像.它正在更新固定数量的图像,但只有第一个'n'计数,所以其余部分都填充了透明的小图像(以清除之前的图像).
(我怀疑每次执行都会创建UIImages,因为执行期间内存消耗过快.)
我已经尝试添加到该行
UIImage* img = [UIImage imageWithCGImage:image];
Run Code Online (Sandbox Code Playgroud)
自动释放,因为我怀疑每次调用此代码时都会创建图像,并且我认为当routeView [indexAux] .image指向新创建的图像时应该调用自动释放.我认为这可行,但它最终以"发送到解除分配的实例的消息"错误结束.
还尝试用以下代码替换该部分:
UIImage* img = [UIImage imageWithCGImage:image];
routeView[indexAux].image = [img copy];
[img release];
Run Code Online (Sandbox Code Playgroud)
...因此,已故的img变量的唯一现有副本存在于routeView [i] .image中,并最终被下一次执行所覆盖.但结束了同样的内存泄漏.欢迎提供任何帮助或提示.提前致谢!
-(void) update:(NSArray*) arr{
int indexAux = 0;
for(NSNumber* i in arr){
int index = [i integerValue];
CGContextRef context = CGBitmapContextCreate(nil,
routeView[indexAux].frame.size.width,
routeView[indexAux].frame.size.height,
8,
4 * routeView[indexAux].frame.size.width,
CGColorSpaceCreateDeviceRGB(),
kCGImageAlphaPremultipliedLast);
self.lineColor = [coloresDeSeccion[index] copy];
CGContextSetStrokeColorWithColor(context, self.lineColor.CGColor);
CGContextSetRGBFillColor(context, 0.0, 0.0, 1.0, 1.0);
CGContextSetLineWidth(context, 5.0);
for(int i = sections[index]; i <= sections[index + 1]; i++) {
CLLocation* …Run Code Online (Sandbox Code Playgroud) 我使用fread()的data.table高效读取大型矩形CSV文件导入R这些都是double(也是唯一double)值-不缺少的元素.
但是,如果我在科学记数法中的数字非常小,它将被转换为破坏整个阅读的字符.这是错误消息(例如,每个小数字都有多个):
16:在fread("SomeCSVFile"):
Bumped列560在数据行16799上键入字符,字段包含'-2.1412168512924677E-308'.将此列中先前读取的值从整数或数字强制转换回可能不是无损的字符; 例如,如果'00'和'000'发生之前它们现在只是'0',并且可能与',,'和',NA'的处理不一致(如果它们发生在碰撞之前的这一列中) ).如果这很重要,请重新运行并为此列设置'colClasses'为'character'.请注意,列类型检测使用前5行,中间5行和后5行,所以希望此消息非常罕见.如果向datatable-help报告,请重新运行并包含verbose = TRUE的输出.
我希望函数将它们设置为零或以最小可能值截断它们(两者都很好).
我正在使用空闲列表实现内存管理器,其节点是一个结构,包含有关要管理的内存块的元数据.
我会在一开始就调用malloc()一次从操作系统中获取一块内存.然后我将使用我自己的程序管理它.在后续程序中,我不能再使用malloc(),所以我必须将元数据(节点列表)保存在该内存中.这是我的问题,假设:
struct list *node1 = malloc(n_bytes); // only call malloc() once here
node1->memStart = node1 + sizeof(struct list) // beginning address of managable
// memory
node1->size = bytes_allocated;
node1->used = 1;
node1->next = NULL;
// starting address of node2
struct list *node2 = node1->memStart + node1->size; // used another node to track the second piece of
// that memory
node2->size = 4096;
node2->used = 0; // node2's memory is unused yet
node2->memStart = node2 + sizeof(struct list);
node2->next = …Run Code Online (Sandbox Code Playgroud) 我覆盖了一个+运算符:
Matrix& Matrix::operator+(Matrix m1)
{
//This should never be triggered
if(this->data.capacity() != m1.data.capacity() || this->data[0].capacity() != m1.data[0].capacity())
{
cout << "Dimensions don't match, can't add.\n";
throw 7;
}
vector<vector<double>> result;
result.resize(m1.data.capacity());
for(int i = 0; i < m1.data.size(); i++)
{
result[i].resize(m1.data[0].size());
for(int j = 0; j < m1.data[0].size(); j++)
{
result[i][j] = m1.data[i][j] + this->data[i][j];
}
}
return Matrix(m1.getRows(),m1.getCols(), result);
}
Run Code Online (Sandbox Code Playgroud)
这是相应的构造函数:
Matrix::Matrix(int rows, int cols, vector<vector<double>> data)
{
this->rows = rows;
this->cols = cols;
this->data = data;
}
Run Code Online (Sandbox Code Playgroud)
这是执行代码: …
我对C++中的内存解除分配感到困惑.我有一个结构
struct Node{
Node* left;
Node* right;
};
Run Code Online (Sandbox Code Playgroud)
我将Node类型的指针声明为:
struct Node* myNode = new Node;
现在,如果我这样delete myNode做,它还取消分配left和right指针内部myNode?如果没有,如果我们在Node类型内部有很多指针并且在没有内存泄漏的情况下编写代码将会非常困难,那会不会非常繁琐?
有内存泄漏吗?该对象是否会被自动删除?
int main ()
{
SomeClass *someObj;
...
someObj = &foo();
...
return 0;
}
SomeClass foo()
{
...
return SomeClass();
}
Run Code Online (Sandbox Code Playgroud) new/delete 关键字是使用免费商店
malloc/free 关键字是使用堆
我看到写在某处new使用malloc.怎么会这样?它们不用于内存段?
第二,我看到写在某个地方free后我们不能使用new或delete之后使用malloc.但如果new使用malloc为什么free不起作用?
我们free在newect 之后使用的地方'.这是错误还是未定义的行为?
谢谢
c++ ×5
memory-leaks ×3
objective-c ×3
ios ×2
pointers ×2
c ×1
csv ×1
data.table ×1
malloc ×1
new-operator ×1
r ×1
struct ×1
uiimage ×1