小编Kir*_*lev的帖子

为什么我使用realloc()获得双重自由错误?

我试图在C中编写一个字符串替换函数,它在a上工作char *,已经使用了malloc().它有点不同,它会找到并替换字符串,而不是起始字符串中的字符.

如果搜索和替换字符串的长度相同(或者替换字符串比搜索字符串短),这很简单,因为我有足够的空间分配.如果我尝试使用realloc(),我会收到一个错误,告诉我我正在做双重免费 - 我不知道我是怎么回事,因为我只是在使用realloc().

也许一点点代码会有所帮助:

void strrep(char *input, char *search, char *replace) {
    int searchLen = strlen(search);
    int replaceLen = strlen(replace);
    int delta = replaceLen - searchLen;
    char *find = input;

    while (find = strstr(find, search)) {

        if (delta > 0) {
            realloc(input, strlen(input) + delta);
            find = strstr(input, search);            
        }

        memmove(find + replaceLen, find + searchLen, strlen(input) - (find - input));
        memmove(find, replace, replaceLen);
    }
}
Run Code Online (Sandbox Code Playgroud)

该程序有效,直到我尝试realloc()在被替换的字符串将比初始字符串长的实例中.(它仍然有点工作,它只是吐出错误以及结果).

如果有帮助,调用代码如下所示: …

c malloc

14
推荐指数
4
解决办法
6580
查看次数

是否需要销毁char*="string"或char*= new char [6]?

我认为这char* = "string"是相同的char* = new char[6].我相信这些字符串是在堆而不是堆栈上创建的.因此,当我使用它们或者它们被自己摧毁时,我是需要销毁它们还是释放它们的记忆?

c++ memory

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

在C#中解析大型XML(大小为1GB)的最佳方法是什么?

我有一个1GB的XML文件,想要解析它.如果我使用XML Textreader或XMLDocument,结果很慢,有时会挂起......

c# xml parsing .net-2.0

13
推荐指数
3
解决办法
1万
查看次数

"似乎"在语言标准中

标准中"似乎"这个短语的确切含义是什么?当用户可以修改行为的各个部分时,它是如何工作的.

在讨论nothrow版本时,问题是关于C++标准operator new.18.4.1.1/7读(我的重点):

这个nothrow版本的operator new返回一个获得的指针,好像从普通版本获得的一样.

我的理解是,只要行为合适,"似乎"就不需要特定的实现.所以,如果operator new像这样实现(我知道这不是一个兼容的实现,因为没有循环或使用new_handler;但我正在缩短它以专注于我的问题):

// NOTE - not fully compliant - for illustration purposes only.
void *operator new(std::size_t s)
{
    void *p = malloc(s);
    if (p == 0)
        throw std::bad_alloc();
    return p;
}
Run Code Online (Sandbox Code Playgroud)

那么写下这样的nothrow版本是合法的:

// NOTE - not fully compliant - for illustration purposes only.
void *operator new(std::size_t s, const std::nothrow_t &nt)
{
    return malloc(s);
}
Run Code Online (Sandbox Code Playgroud)

但是,假设程序替换operator new为使用其他分配器."似乎"意味着编译器必须自动更改nothrow版本的行为才能使用其他分配器吗?开发人员是否需要更换普通版本和非版本版本?

c++ standards standards-compliance

13
推荐指数
1
解决办法
584
查看次数

永远不会调用TaskScheduler.UnobservedTaskException

根据我的研究,我学到了以下内容:

  1. TaskScheduler.UnobservedTaskException必须等待该任务被垃圾收集,然后该任务的未被观察到的异常将冒泡到该UnobservedTaskException事件.
  2. 如果你正在使用Task.Wait()它,它永远不会被调用,因为你正在阻止来自Task的即将发生的结果,因此异常将被抛出Task.Wait()而不是冒泡到UnobservedException事件.
  3. GC.Collect()手动调用通常是一个坏主意,除非你确切地知道你正在做什么,因此在这种情况下确认事情是好的,但不能作为问题的正确解决方案.

问题

如果我的应用程序在垃圾收集器启动之前退出,我绝对100%无法UnobservedTaskException触发我的事件.

请注意以下代码:

class Program
{
    static void Main(string[] args)
    {
        TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;

        Task.Factory.StartNew(() =>
        {
            Console.WriteLine("Task started.");
            throw new Exception("Test Exception");
        });

        Thread.Sleep(1000);
        //GC.Collect();
        //GC.WaitForPendingFinalizers();
    }

    static void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e)
    {
        File.WriteAllText(@"C:\data\TestException.txt", e.Exception.ToString());
        Console.WriteLine("UNOBSERVED EXCEPTION");
    }
}
Run Code Online (Sandbox Code Playgroud)

没有写入异常文件,也没有任何内容写入控制台.在应用程序退出后10-15分钟甚至更长时间可以继续,但我仍然看不到我的应用程序的遗骸被垃圾收集的证据.您可能会问,为什么不在退出时收集?好吧,我的真实场景是我的异常陷阱在Windows服务中托管的WCF服务内运行.当Windows服务关闭(因此手动调用GC.Collect())时,我无法陷阱,因为就我所见,没有任何事件.

我哪里错了?我如何确保如果WCF服务内部的某些内容最终会破坏我的Windows服务,那么我有机会在服务崩溃之前记录异常?

.net garbage-collection exception

13
推荐指数
2
解决办法
4401
查看次数

Win32 - 从C/C++中选择目录对话框

如何从本机Win32应用程序中选择现有文件夹(或创建新文件夹)?

这是一个类似的问题.它对C#/ .NET有很好的答案.但是我希望原生Win32能做同样的事情.

有人知道解决方案,免费代码等吗?

更新:

我从答案中尝试了这个功能.除了必须调用SHGetPathFromIDList函数来检索所选目录的名称之外,所有内容都按预期工作.这是一个示例屏幕截图:

目录提取对话框的示例.

c++ winapi

13
推荐指数
3
解决办法
3万
查看次数

Automapper:ForMember中的复杂if else语句

假设Date可以为null DateTime:

Mapper.CreateMap<SomeViewModels, SomeDTO>()               
             .ForMember(dest => dest.Date,
                        opt => opt.MapFrom(src =>
                        {
                            DateTime? finalDate = null;
                            if (src.HasDate == "N")
                            {
                                // so it should be null
                            }
                            else
                            {                                   
                                endResult = DateTime.Parse(src.Date.ToString());

                            }                               
                            return finalDate;

                        }));
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:"错误30带有语句体的lambda表达式无法转换为表达式树."

当然,我完全清楚我可以简化查询,例如:

Mapper.CreateMap<SomeViewModels, SomeDTO>()
             .ForMember(dest => dest.Date,
                        opt => opt.MapFrom(src => src.HasDate == "N" ? null : DateTime.Parse(src.Date.ToString())));
Run Code Online (Sandbox Code Playgroud)

但是,如果我坚持保留第一个例子的结构,因为我有更复杂的if else语句,第二个例子无法满足或至少不具有可读性,该怎么办?

c# automapper

13
推荐指数
2
解决办法
1万
查看次数

C头文件循环

我有几个头文件,归结为:

tree.h中:

#include "element.h"

typedef struct tree_
{
    struct *tree_ first_child;
    struct *tree_ next_sibling;
    int tag;
    element *obj;
    ....
} tree;
Run Code Online (Sandbox Code Playgroud)

和element.h:

#include "tree.h"

typedef struct element_
{
    tree *tree_parent;
    char *name;
    ...
} element;
Run Code Online (Sandbox Code Playgroud)

问题是它们都相互引用,因此树需要包含元素,元素需要包含树.

这不起作用,因为要定义"树"结构,元素结构必须已知,但要定义元素结构,必须知道树结构.

如何解决这些类型的循环(我认为这可能与'前向声明'有关?)?

c include-guards

12
推荐指数
2
解决办法
1万
查看次数

有没有办法在不使用构造函数的情况下初始化结构的成员?

我有一个struct包含两个列表:

struct MonthData
{
   public List<DataRow> Frontline;
   public List<DataRow> Leadership;
}
Run Code Online (Sandbox Code Playgroud)

但是,我想在创建结构时初始化它们.如果我尝试:

struct MonthData
{
   public List<DataRow> Frontline = new List<DataRow>();
   public List<DataRow> Leadership = new List<DataRow>();
}
Run Code Online (Sandbox Code Playgroud)

然后我得到:

Error   23  'MonthData.Frontline': cannot have instance field initializers in structs
...
Run Code Online (Sandbox Code Playgroud)

由于结构不能有无参数构造函数,我不能只在构造函数中设置它.到目前为止,我只能看到以下选项:

  1. 在创建MonthData实例时初始化这两个属性
  2. 使用类而不是结构
  3. 使用参数创建构造函数并使用它
  4. 为懒惰初始化它们的属性创建getter和setter.

推荐的方法是什么?现在,我在想这个课程是最好的主意.

c# struct

12
推荐指数
3
解决办法
1万
查看次数

在C中更改当前进程的优先级

在Windows上,我可以这样做:

HANDLE hCurrentProcess = GetCurrentProcess();

SetPriorityClass(hCurrentProcess, ABOVE_NORMAL_PRIORITY_CLASS);
Run Code Online (Sandbox Code Playgroud)

我怎么能在*nix上做同样的事情?

c unix process-management cross-platform

11
推荐指数
2
解决办法
2万
查看次数