小编Mat*_*Mut的帖子

Microsoft内部PriorityQueue <T>中的错误?

在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)

.net c# priority-queue

77
推荐指数
2
解决办法
3539
查看次数

在C++中从析构函数中复活对象?

免责声明:我知道这是一个糟糕的设计,我只是出于好奇而问这个问题,以便尝试深入了解析构函数在C++中是如何工作的.

在C#中,可以编写:GC.KeepAlive(this)在类的析构函数中(参见下面的编辑),这意味着即使在析构函数调用完成后,该对象仍将在内存中存活.

C++的设计是否允许从析构函数中恢复一个类似于上述C#算法的对象?

编辑:正如下面的答案所指出的,GC.ReRegisterForFinalize()与问题的关系更为密切GC.KeepAlive(this).

c++ destructor lifetime

48
推荐指数
4
解决办法
4506
查看次数

这个C结构赋值语句是否合法?

这是一个代码示例,后跟我的问题:

#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并且安全吗?我希望这个问题很清楚.

c

20
推荐指数
2
解决办法
637
查看次数

如何使用std :: is_volatile?

我试图禁止对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++ templates static-assert c++11

19
推荐指数
2
解决办法
1511
查看次数

为什么将结构转换为类似的类排序?

警告:这仅仅是那些热衷于破解东西以理解其力学的人的练习.

我正在探索我在C#中可以实现的极限,并且我编写了一个ForceCast()函数来执行一个没有任何类型检查的强力转换.切勿考虑在生产代码中使用此功能.

我写了一个名为call的类Original和一个名为struct的结构LikeOriginal,两个都有两个整数变量.在Main()我创建了一个名为新变量orig,并将其设置为一个新的实例Originala=7b=20.何时orig被转换LikeOriginal并存储casted,其值cGdG未定义,这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并打印的价值ab,令人惊讶的是,他们成功地通过3递增,而这一直是重复的.

让我感到困惑的是,将类强制转换为struct将导致cGdG映射到类元数据,但是当它们被修改并强制转换为类时,它们会正确映射到ab.

为什么会这样?

使用的代码:

using System;
using System.Runtime.InteropServices;

namespace BreakingStuff {
    public class Original …
Run Code Online (Sandbox Code Playgroud)

c# struct casting class memory-layout

14
推荐指数
1
解决办法
355
查看次数

防止Win32绘制经典标题栏

我想为我的无边框形式添加一个漂亮的阴影,而我发现以最小的性能损失实现它的最好方法是使用DwmExtendFrameIntoClientArea.然而,这似乎导致Windows在窗口上绘制经典标题栏,但它是无功能的(即,故障仅仅是图形化的).

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

c# windows aero dwm winforms

6
推荐指数
1
解决办法
318
查看次数

如何在 ASP.Net Core 中使用文件嵌套来嵌套接口

我想在 Visual Studio 中使用 Microsoft 的自定义文件嵌套选项来嵌套实现类文件及其“父”接口,因此在本示例中,我希望在解决方案资源管理器中ReportRepository.cs嵌套出现IReportRepository.cs。所有存储库都应该如此。

解决方案资源管理器中的文件

我已经在.filenesting.json解决方案的根目录中创建了该文件,但我不知道如何使用它并且文档非常稀疏

有谁知道我如何在 Visual Studio 2019 中实现这一目标?

visual-studio visual-studio-2019

6
推荐指数
2
解决办法
1493
查看次数

用C++将调用堆栈扩展到磁盘?

当涉及大规模递归方法调用时,必须通过修改适当的编译器参数来扩展调用堆栈大小,以避免堆栈溢出.

让我们考虑编写一个便携式应用程序,其布局足够简单,以便其用户只需要最少的技术知识,因此手动虚拟内存配置是不可能的.

运行大规模递归方法(显然是在幕后)可能会导致超出调用堆栈限制,尤其是在应用程序运行的机器受内存限制的情况下.

足够的聊天:在C++中,如果内存(几乎)已满,可以手动将调用堆栈扩展到磁盘吗?

c++ callstack

5
推荐指数
1
解决办法
264
查看次数

如何在 Windows 上实现桌面覆盖模糊?

当我在 Windows 10 上安装 AMD 图形驱动程序时,我注意到背景外观模糊,这是我希望在我的应用程序中实现的风格。

AMD Radeon 安装程序

我曾尝试使用UpdateLayeredWindow,但它没有应用模糊效果。我曾尝试使用DwmExtendFrameIntoClientAreaDwmEnableBlurBehindWindow,但我不确定如何自定义窗口着色和图像叠加。

有一个DwmGetColorizationColor函数,但没有匹配的 DwmSetColorizationColor 函数。有多种方法可以设置系统范围的着色,但我希望着色仅影响我的应用程序窗口。此外,Aero Glass™ 已从 Windows 8 和 10 中删除。

如何以适用于 Windows 8/10 的方式使用 WinForms 在我的应用程序中包含这些效果?如果 WPF 可以呈现这些效果,它是如何做到的,我如何在 WinForms 上实现类似的效果?

c# windows effects dwm winforms

5
推荐指数
1
解决办法
2707
查看次数

你能知道free()是否在C中成功而没有崩溃?

malloc()如果分配不成功,则返回空指针.free()遗憾的是,不会重新分配是否成功,因为其签名是:

void free(void* ptr)
Run Code Online (Sandbox Code Playgroud)

是否有可能:

  1. free()在没有调试器为您崩溃应用程序的情况下尝试并知道释放是否成功?

  2. 事先free()得到指针是否会导致失败或成功?

c free

4
推荐指数
1
解决办法
783
查看次数