小编Sch*_*eff的帖子

CRT 不打印内存泄漏的行号

我有下面的代码,我认为基于Find Memory Leaks Using the CRT Library,应该打印出内存泄漏的行号。

#include "stdafx.h"
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#include <iostream>


void derp()
{
    int* q = new int;

}

int main()
{
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
    derp();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我得到以下信息:

Detected memory leaks!
Dumping objects ->
{75} normal block at 0x0067E930, 4 bytes long.
 Data: <    > CD CD CD CD 
Object dump complete.
Run Code Online (Sandbox Code Playgroud)

根据 Microsoft 的文档,我希望看到分配泄漏内存的行的打印输出,但我没有。

我做错了什么?我正在使用 VS2015。

c++ memory-leaks crt

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

可变参数模板的无递归扩展到数组访问

考虑以下非类型可变参数模板函数:

template <typename dummy = void>
void write_at_offsets(volatile char *p) {
}

template <size_t OFF, size_t... OFFs>
void write_at_offsets(volatile char *p) {
    p[OFF] = 1;
    write_at_offsets<OFFs...>(p);
}
Run Code Online (Sandbox Code Playgroud)

它使用递归方法在模板参数包中指定的偏移量处写入 1。

这是否可以在 C++11 中不使用递归而简洁地编写,例如,通过一次性扩展整个包?

c++ variadic-templates c++11

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

指向成员的成员的指针

C++ 允许定义指向类成员的指针,例如:

struct A
{
  int i;
};

void a()
{
  int A::*p = &A::i;
}
Run Code Online (Sandbox Code Playgroud)

但是如果我想要一个指向像这样更深“级别”的成员的指针怎么办?

struct A
{
  int i;
  struct B{int j;};
  B b;
};

void a()
{
  int A::*p = &A::b::j;
}
Run Code Online (Sandbox Code Playgroud)

从理论上讲,如果指向成员的指针从对象的开头编译为偏移,这可能很容易被语言支持,尽管像虚拟/钻石继承这样的事情可能会使这变得太复杂

在没有性能损失或未定义行为的情况下实现这一目标的最简单方法是什么?

我的第一个想法是只使用偏移量并使用对象上的原始指针,但这似乎不是定义的行为,并且也会使编译器无法检测我是否指向具有正确类型的实际字段

c++ pointer-to-member c++11

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

在 Python 中执行 { } while (false)

在 C++ 中,我有时会使用以下类型的代码:

do {
  if (!cond1) break; // bail-out
  if (!cond2) break; // bail-out
  // and so on with many more conditions

  // finally:
  // do what I actually want to do
  // when none of the previous conditions caused a bail-out
} while (false);
Run Code Online (Sandbox Code Playgroud)

因此,do { } while (false);实际上并不打算作为循环,而只是一个方便的替代if-else级联的技巧。(请注意,所有这些都发生在一个块范围内,并具有所有积极影响。)

现在,我想在 Python 中做类似的事情,但我想了解是否有Pythonic替代方案。

python python-3.x

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

C/CPP - 将浮点运算转换为整数运算

我有以下 c++ 函数(实现Bresenham's line algorithm),在书中看到

从像素到可编程图形硬件的计算机图形 作者 Alexey Boreskov, Evgeniy Shikin

其中一个函数使用浮点数,由于其效率低下,本书介绍了另一个仅使用整数算术的函数。

我很难理解为什么这两个是等价的,为什么我们<<在这里使用左移,而不是a<<1简单地乘以a2?

注:我们假设点A:(xa,ya)和B:(xb,yb)具有整数值。


浮动版

void drawLine(int xa, int ya, int xb, int yb, int color) {
    float k = (float)(yb-ya)/(float)(xb-xa);
    float d = 2*k - 1
    int y = ya;

    putPixel(xa, ya, color); // paint the pixel (xa,ya) in color "color"

    for (int x = xa+1; x<=xb; x++) {
        if (d > 0) {
            d += …
Run Code Online (Sandbox Code Playgroud)

c c++ algorithm floating-point integer

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

为什么未关闭的文件大小是 4 个字节

为什么此代码创建大小为 4 字节的文件,但文件未关闭。

ofstream output("number.bin");
int16_t value = 2570;
output.write(reinterpret_cast<const char*>(&value), sizeof(value));
Run Code Online (Sandbox Code Playgroud)

c++

0
推荐指数
1
解决办法
142
查看次数

将 float[] 作为 float* 参数传递的问题

我会尽量直截了当。

我有一个练习要解决,我在网上搜索了很多,但找不到我的问题所在。

因为这是一个“原样”练习,我不能将 float* 修改为 float[],我必须使用给定的值和给定的函数签名。我只能使用 setWeight 函数的包含。

考虑以下:

class Train
{
    protected:
    float* weight;

    public:
    setWeight(float* weight)
    {
        this->weight = weight;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在主要我调用以下内容:

main()
{
    float weights[] = { 30.5f, 20.0f, 12.7f, 15.88f };
    train.setWeight(weights);
}
Run Code Online (Sandbox Code Playgroud)

当我查看调试模式时,只有第一个值被传递。有人可以帮我吗?

c++

0
推荐指数
1
解决办法
93
查看次数

覆盖C数组中的第一个元素

以下代码有效:

uint8_t test[2] = "7";
cout << test[0];
Run Code Online (Sandbox Code Playgroud)

但是,如果我之后添加以下代码,以便将“ 7”更改为“ 5”,则它将无法工作:

test[0] = "5";
cout << test[0];
Run Code Online (Sandbox Code Playgroud)

我收到错误:

错误:从'const char *'到uint8_t的无效转换

这是为什么?

c++ arrays

-1
推荐指数
1
解决办法
102
查看次数

执行此代码时,我得到了分段故障核心转储

我收到错误:分段故障核心被丢弃.

#include<stdlib.h>
#include<stdio.h>
char *strcpy(char *s,char *t)
{
  char *ptr = s;
  while((*s = *t) != '\0')
    s++;
  t++;
  return ptr;
}
int main()
{
  char *s = malloc(sizeof(char) * 12);
  char *t;
  scanf("%s",t);
  printf("%s",strcpy(s,t));
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

c

-3
推荐指数
1
解决办法
87
查看次数