前段时间我发布了一个与WriteableBitmap内存泄漏相关的问题,虽然我收到了与该问题相关的精彩提示,但我仍然认为有一个严重的错误/(我犯了错误)/(混乱)/(其他一些东西)这里.
所以,这是我的问题:
假设我们有一个带有图像和按钮的WPF应用程序.图像的源是一个非常大的位图(3600*4800像素),当它在运行时显示时,应用程序消耗~90 MB.
现在假设我希望从图像源(真正的大图像)实例化一个WriteableBitmap,当发生这种情况时,应用程序消耗大约220 MB.
现在到了棘手的部分,当对图像的修改(通过WriteableBitmap)结束时,对WriteableBitmap的所有引用(至少是我所知道的那些)都被销毁(在方法结束时或通过设置它们)为null)应释放writeableBitmap使用的内存,应用程序消耗应返回到~90 MB.问题是有时它会返回,有时却不会.
这是一个示例代码:
// The Image's source whas set previous to this event
private void buttonTest_Click(object sender, RoutedEventArgs e)
{
if (image.Source != null)
{
WriteableBitmap bitmap = new WriteableBitmap((BitmapSource)image.Source);
bitmap.Lock();
bitmap.Unlock();
//image.Source = null;
bitmap = null;
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,引用是本地的,并且应该在方法结束时释放内存(或者当垃圾收集器决定这样做时).但是,该应用程序可能消耗~224 MB直到宇宙结束.
任何帮助都会很棒.
我正在试图找出如何释放WriteableBitmap内存.
在下一部分代码中,我填充了一个WriteableBitmap的后备缓冲区,其中包含来自"BigImage"(3600*4800 px,仅用于测试)的大量数据.如果我评论位图和图像等于null的行,那么内存即使不再使用图像和位图,它也不会发布,应用程序消耗大约230 MB!
正如您在代码末尾所看到的,调用GC.Collect()来释放内存是必要的.
所以问题是,释放WriteableBitmap对象使用的内存的正确方法是什么?GC.Collect()是唯一的方法吗?
任何帮助都会很棒.
PS.对不起,我的英语不好.
private void buttonTest_Click(object sender, RoutedEventArgs e)
{
Image image = new Image();
image.Source = new BitmapImage(new Uri("BigImage"));
WriteableBitmap bitmap = new WriteableBitmap(
(BitmapSource)image.Source);
bitmap.Lock();
// Bitmap processing
bitmap.Unlock();
image = null;
bitmap = null;
GC.Collect();
}
Run Code Online (Sandbox Code Playgroud) 对不起,如果之前有人询问,但我找不到足够明确的答案.
在C++中提供对数组成员的公共只读访问权的正确方法是什么?
如果我有类似以下的类:
class Particle
{
double _position[10];
public:
double* get_position()
{
return _position;
}
};
我想要返回一个指向数组的指针真的很糟糕,因为这意味着它可以在类之外的任何时候更改,是否足以返回一个const指针?
我已经看到了关于在C++中使用数组的其他问题,以及如何使用向量是一个更好的选择,但我对这个问题非常好奇.
你可以看到我只是一个C++菜鸟,如果这是一个愚蠢的问题,对不起.
PD抱歉我的英语不好.
假设我有一个以缩放方式显示其来源的图像,我如何使用MouseMove事件在标签或文本块中显示光标所在的像素位置?
(我需要像素坐标而不是图像相对于其大小的坐标)
提前致谢.
在做一个小学校项目时,我只是注意到以下范围的差异std::uniform_int_distribution<int>:
使用 g++ 时,范围是 [a, b],但是当使用 msvc (Visual Studio 2010) 时,范围是 (a, b],因此以下程序的输出:
#include <iostream>
#include <random>
using std::cout;
using std::cin;
int main()
{
std::mt19937 random;
std::uniform_int_distribution<int> intDist(-1, 1);
for(int i = 0; i < 100; i++)
{
cout << intDist(random) << "\n";
}
cin.get();
}
Run Code Online (Sandbox Code Playgroud)
使用 g++ 时会在某个时候显示 -1,但使用 msvc 时永远不会显示 -1。
我知道编译器之间存在这种差异是很常见的,但是请注意 MSDN 文档和范围应该是 [a, b] 的标准标记。
这种行为的原因是什么?
好吧,我承认,我是一个完全的C++菜鸟.
我正在检查Adam Drozdek在C++中的数据结构和算法,在第1.5节:"多态性"中他提出了下一个例子:
class Class1
{
public:
virtual void f()
{
cout << "Function f() in Class1" << endl;
}
void g()
{
cout << "Function g() in Class1" << endl;
}
};
class Class2
{
public:
virtual void f()
{
cout << "Function f() in Class2" << endl;
}
void g()
{
cout << "Function g() in Class2" << endl;
}
};
class Class3
{
public:
virtual void h()
{
cout << "Function h() in Class3" << endl;
} …Run Code Online (Sandbox Code Playgroud) 好吧,也许我很笨,但为什么下面的代码中没有抛出任何异常?

很明显,访问_cells数组的索引是负数(posCol + col = -1),如图所示.
提前致谢.
c++ ×3
wpf ×2
arrays ×1
c# ×1
coordinates ×1
dispose ×1
gcc ×1
memory ×1
memory-leaks ×1
mousemove ×1
pixel ×1
polymorphism ×1
random ×1
visual-c++ ×1