在PresentationCore.dll的.NET Framework中,有一个泛型PriorityQueue<T>
类,其代码可以在这里找到.
我写了一个简短的程序来测试排序,结果不是很好:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using MS.Internal;
namespace ConsoleTest {
public static class ConsoleTest {
public static void Main() {
PriorityQueue<int> values = new PriorityQueue<int>(6, Comparer<int>.Default);
Random random = new Random(88);
for (int i = 0; i < 6; i++)
values.Push(random.Next(0, 10000000));
int lastValue = int.MinValue;
int temp;
while (values.Count != 0) {
temp = values.Top;
values.Pop();
if (temp >= lastValue)
lastValue = temp;
else
Console.WriteLine("found sorting error");
Console.WriteLine(temp);
}
Console.ReadLine();
} …
Run Code Online (Sandbox Code Playgroud) 免责声明:我知道这是一个糟糕的设计,我只是出于好奇而问这个问题,以便尝试深入了解析构函数在C++中是如何工作的.
在C#中,可以编写:GC.KeepAlive(this)
在类的析构函数中(参见下面的编辑),这意味着即使在析构函数调用完成后,该对象仍将在内存中存活.
C++的设计是否允许从析构函数中恢复一个类似于上述C#算法的对象?
编辑:正如下面的答案所指出的,GC.ReRegisterForFinalize()
与问题的关系更为密切GC.KeepAlive(this)
.
这是一个代码示例,后跟我的问题:
#include <stdio.h>
#include <string.h>
struct st {
char stringField[100];
int intField;
};
typedef struct st st;
void test(st *parameterStruct)
{
st localStruct;
strcpy(localStruct.stringField, "HELLO");
localStruct.intField = 5;
*parameterStruct = localStruct;
}
int main()
{
st myStruct;
strcpy( myStruct.stringField, "XXX" );
myStruct.intField = 9;
printf("%s,%i\n", myStruct.stringField, myStruct.intField );
test(&myStruct);
printf("%s,%i\n", myStruct.stringField, myStruct.intField);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
OUTPUT:
XXX,9
HELLO,5
Run Code Online (Sandbox Code Playgroud)
我在想,因为结构'localStruct'是在一个函数内创建的(不使用malloc),它具有局部范围,因此一旦函数停止执行,它就可以自由地覆盖存储它的内存位置.但是,我尝试运行此示例程序并执行它没有任何问题.因为我将'myStruct'分配给局部变量'localStruct'(而不是动态分配的'localStruct'),所以我认为第二个打印语句会将乱码打印到屏幕上.我知道如果使用malloc创建了'localStruct',就不会出现这样的问题.
我的问题:是通过在函数测试中使用指针将结构变量'myStruct'(一个非动态局部变量)分配给y并且安全吗?我希望这个问题很清楚.
我试图禁止对volatile类型进行特定操作.为了实现这一点,我试图使用std::is_volatile
,但下面的代码编译没有错误,这不是我想要的.
为什么在下面的情况下是is_volatile::value
假的?
#include <type_traits>
template<typename T>
inline void DoStuff(T val) {
static_assert(!std::is_volatile<T>::value, "No volatile types plz");
//...
}
int main() {
volatile char sometext[261];
DoStuff(sometext);
}
Run Code Online (Sandbox Code Playgroud) 警告:这仅仅是那些热衷于破解东西以理解其力学的人的练习.
我正在探索我在C#中可以实现的极限,并且我编写了一个ForceCast()
函数来执行一个没有任何类型检查的强力转换.切勿考虑在生产代码中使用此功能.
我写了一个名为call的类Original
和一个名为struct的结构LikeOriginal
,两个都有两个整数变量.在Main()
我创建了一个名为新变量orig
,并将其设置为一个新的实例Original
与a=7
和b=20
.何时orig
被转换LikeOriginal
并存储casted
,其值cG
和dG
未定义,这LikeOriginal
是一个结构和类实例包含比结构实例更多的元数据,因此导致内存布局不匹配.
示例输出:
Casted Original to LikeOriginal
1300246376, 542
1300246376, 542
added 3
Casted LikeOriginal back to Original
1300246379, 545
Run Code Online (Sandbox Code Playgroud)
但是请注意,当我打电话casted.Add(3)
,并转换回Original
并打印的价值a
和b
,令人惊讶的是,他们成功地通过3递增,而这一直是重复的.
让我感到困惑的是,将类强制转换为struct将导致cG
并dG
映射到类元数据,但是当它们被修改并强制转换为类时,它们会正确映射到a
和b
.
为什么会这样?
使用的代码:
using System;
using System.Runtime.InteropServices;
namespace BreakingStuff {
public class Original …
Run Code Online (Sandbox Code Playgroud) 我想为我的无边框形式添加一个漂亮的阴影,而我发现以最小的性能损失实现它的最好方法是使用DwmExtendFrameIntoClientArea.然而,这似乎导致Windows在窗口上绘制经典标题栏,但它是无功能的(即,故障仅仅是图形化的).
这是我正在使用的代码:
int v = (int) DWMNCRENDERINGPOLICY.DWMNCRP_ENABLED;
NativeApi.DwmSetWindowAttribute(Handle, DwmWindowAttribute.NCRENDERING_POLICY, ref v, sizeof(int));
int enable = 0;
NativeApi.DwmSetWindowAttribute(Handle, DwmWindowAttribute.ALLOW_NCPAINT, ref enable, sizeof(int));
MARGINS margins = new MARGINS() {
leftWidth = 0,
topHeight = 0,
rightWidth = 0,
bottomHeight = 1
};
NativeApi.DwmExtendFrameIntoClientArea(Handle, ref margins);
Run Code Online (Sandbox Code Playgroud)
我已经尝试设置ALLOW_NCPAINT
为1,我甚至尝试在WM_NCPAINT
没有调用的情况下接收窗口时返回0 DefWndProc
,但它没有任何区别.
有没有办法在使用时解决这个奇怪的问题DwmExtendFrameIntoClientArea
?
我想在 Visual Studio 中使用 Microsoft 的自定义文件嵌套选项来嵌套实现类文件及其“父”接口,因此在本示例中,我希望在解决方案资源管理器中ReportRepository.cs
嵌套出现IReportRepository.cs
。所有存储库都应该如此。
我已经在.filenesting.json
解决方案的根目录中创建了该文件,但我不知道如何使用它并且文档非常稀疏。
有谁知道我如何在 Visual Studio 2019 中实现这一目标?
当涉及大规模递归方法调用时,必须通过修改适当的编译器参数来扩展调用堆栈大小,以避免堆栈溢出.
让我们考虑编写一个便携式应用程序,其布局足够简单,以便其用户只需要最少的技术知识,因此手动虚拟内存配置是不可能的.
运行大规模递归方法(显然是在幕后)可能会导致超出调用堆栈限制,尤其是在应用程序运行的机器受内存限制的情况下.
足够的聊天:在C++中,如果内存(几乎)已满,可以手动将调用堆栈扩展到磁盘吗?
当我在 Windows 10 上安装 AMD 图形驱动程序时,我注意到背景外观模糊,这是我希望在我的应用程序中实现的风格。
我曾尝试使用UpdateLayeredWindow,但它没有应用模糊效果。我曾尝试使用DwmExtendFrameIntoClientArea和DwmEnableBlurBehindWindow,但我不确定如何自定义窗口着色和图像叠加。
有一个DwmGetColorizationColor函数,但没有匹配的 DwmSetColorizationColor 函数。有多种方法可以设置系统范围的着色,但我希望着色仅影响我的应用程序窗口。此外,Aero Glass™ 已从 Windows 8 和 10 中删除。
如何以适用于 Windows 8/10 的方式使用 WinForms 在我的应用程序中包含这些效果?如果 WPF 可以呈现这些效果,它是如何做到的,我如何在 WinForms 上实现类似的效果?
malloc()
如果分配不成功,则返回空指针.free()
遗憾的是,不会重新分配是否成功,因为其签名是:
void free(void* ptr)
Run Code Online (Sandbox Code Playgroud)
是否有可能:
free()
在没有调试器为您崩溃应用程序的情况下尝试并知道释放是否成功?
事先free()
得到指针是否会导致失败或成功?