小编ant*_*009的帖子

设置条件以避免双重释放已分配的内存

Ubuntu 10.10 gcc 4.4.4

我只是在尝试分配和释放.

但是,当一个对象被多次释放时,我试图避免这个问题.

但是,当我测试时,我注意到创建和释放的obj没有返回到null状态.那么有什么条件我可以设置,如果这确实发生将避免?

我也试过在free之后将对象设置为NULL.但是,它仍然试图释放该对象.

这是对这个问题的引用,只是让你知道不重复: 释放已分配的内存

我的代码如下:

#include <stdio.h>
#include "objects.h"

int main(void)
{
    obj_t *obj = NULL;

    obj = create_object();

    destroy_object(obj);

    destroy_object(obj);

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

==

#ifndef OBJECTS_H_INCLUDED
#define OBJECTS_H_INCLUDED

typedef struct Obj_t obj_t;

obj_t* create_object();
void destroy_object(obj_t *obj);

#endif /* OBJECTS_H_INCLUDED */
Run Code Online (Sandbox Code Playgroud)

==

#include <stdio.h>
#include <stdlib.h>

#include "objects.h"

struct Obj_t {
    int obj_id;
};

obj_t* create_object()
{
    obj_t *obj = malloc(sizeof obj);

    return obj;
}

void destroy_object(obj_t *obj)
{
    if(obj != NULL) { …
Run Code Online (Sandbox Code Playgroud)

c malloc free

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

malloc和calloc之间的使用差异

gcc 4.5.1 c89
Run Code Online (Sandbox Code Playgroud)

我已经编写了这个源代码,以便我更好地理解malloc和calloc.

我理解,但只是有几个问题.

dev = malloc(number * sizeof *devices);
Run Code Online (Sandbox Code Playgroud)

等于这个calloc.我并不担心清理内存.

dev = calloc(number, sizeof *devices);
Run Code Online (Sandbox Code Playgroud)

与在while循环中执行5次相比,这究竟是什么呢?

dev = malloc(sizeof *devices);
Run Code Online (Sandbox Code Playgroud)

我想第一个和第二个是创建一个指向5结构设备的指针.第三个是创建一个指向结构设备的指针?

我的程序说明了使用valgrind编译和运行的3种不同方法--leak-check = full.

非常感谢任何建议.

#include <stdio.h>
#include <stdlib.h>

struct Devices {
#define MAX_NAME_SIZE 80
    size_t id;
    char name[MAX_NAME_SIZE];
};

struct Devices* create_device(struct Devices *dev);
void destroy_device(struct Devices *dev);

int main(void)
{
    size_t num_devices = 5;
    size_t i = 0;
    struct Devices *device = NULL;
    struct Devices *dev_malloc = NULL;
    struct Devices *dev_calloc = NULL;

    for(i = 0; …
Run Code Online (Sandbox Code Playgroud)

c malloc calloc

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

使用makefile创建单元测试

gcc 4.7.2
c89
Run Code Online (Sandbox Code Playgroud)

你好,

我想知道是否有任何人知道任何教程或教科书,涵盖使用makefile为我的c程序创建一些简单的单元测试.

我想运行一些自动化测试,创建一个测试套件并将其添加到我的Makefile中.

只想了解如何开始的一些想法.

非常感谢任何建议

c unit-testing makefile

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

使用可变参数进行格式化

c89 gcc 4.7.4

你好,

我只是试验这些宏:

#define LOG_INFO_1(fmt, ...) printf(fmt, __VA_ARGS__)
#define LOG_INFO_2(...) printf(__VA_ARGS__)
Run Code Online (Sandbox Code Playgroud)

并使用这样:

LOG_INFO_1("%s:%d", __func__, __LINE__);
LOG_INFO_2("%s:%d", __func__, __LINE__);
Run Code Online (Sandbox Code Playgroud)

输出提供完全相同的格式.我只是想知道fmt在我的第一个宏中使用参数有什么好处?它似乎并不是真的需要.我怎么能利用它呢?

非常感谢任何建议,

c variadic

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

将指针作为本地传递给函数

gcc 4.7.2 c89
Run Code Online (Sandbox Code Playgroud)

你好,

我有以下功能:

void module_param_destroy(module_param_t *param)
{
    param = NULL;

    /* Stop the compiler from complaining */
    APR_UNUSED(param);
}
Run Code Online (Sandbox Code Playgroud)

而我这样称呼它:

module_param_destroy(module->call_param);
Run Code Online (Sandbox Code Playgroud)

参数param是否设置为NULL.当我传递本地副本时,我认为它在这里没有做任何有用的事情.

这样做会更好吗:

void module_param_destroy(module_t *md)
{
    md->param = NULL;

    /* Stop the compiler from complaining */
    APR_UNUSED(md->param);
}
Run Code Online (Sandbox Code Playgroud)

并称之为:

module_param_destroy(md);
Run Code Online (Sandbox Code Playgroud)

这些结构从malloc全局分配了内存.

非常感谢任何建议,

c pointers

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

屏蔽按位运算符

gcc (GCC) 4.8.2
c89
Run Code Online (Sandbox Code Playgroud)

你好,

屏蔽按位运算符:

我想掩盖以下内容:

SIGNAL_ID_EVENT_DTMF_1 | SIGNAL_ID_EVENT_DTMF_STAR | SIGNAL_ID_EVENT_DTMF_POUND
Run Code Online (Sandbox Code Playgroud)

我用以下函数设置上面的内容:

static void g_convert2_ipm_digits(unsigned short *terminator)
{
    *terminator = SIGNAL_ID_EVENT_DTMF_1 | SIGNAL_ID_EVENT_DTMF_STAR | SIGNAL_ID_EVENT_DTMF_POUND;

}
Run Code Online (Sandbox Code Playgroud)

因此,当一个数字进入I&(和)它以查看该模式是否存在:

static apk_bool_t g_check_term_digit(unsigned short terminators, unsigned short digit)
{
    if(terminators & digit) {
        return TRUE;
    }
    return FALSE
}
Run Code Online (Sandbox Code Playgroud)

但是,无论数字是多少,函数总是返回true.只应该为我掩盖的那些返回true.

当我在上面的函数中检查调试器时,我得到以下函数.但是,这不应该返回true,因为已按下的数字是5.

(gdb) p terminators
$22 = 11
(gdb) p digit
$23 = 5
Run Code Online (Sandbox Code Playgroud)

我期望的数字在下面的枚举中定义:

typedef enum
{       
        SIGNAL_ID_EVENT_DTMF_0                                               = 0x0,
        SIGNAL_ID_EVENT_DTMF_1                                               = 0x1,
        SIGNAL_ID_EVENT_DTMF_2                                               = 0x2,
        SIGNAL_ID_EVENT_DTMF_3                                               = 0x3,
        SIGNAL_ID_EVENT_DTMF_4                                               = 0x4, …
Run Code Online (Sandbox Code Playgroud)

c bit-manipulation

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

使用接口类型实例化实现接口的类对象

使用接口作为类型来实例化类对象有些困惑.为什么我们需要将接口作为一种类型?什么时候我们可以使用这个类?因为该类实现了接口.我知道你无法实例化一个接口.

非常感谢任何建议,

   public interface SortRecords {
        int query(int rowId);
    }

    public class OurPrice implements SortRecords {
        @Override
        public int query(int rowId) {
            return 0;
        }
    }

    public void test() {
        /* 
         * Why has the interface as the type? 
         */
        SortRecords sorterV1 = new OurPrice();
        sorterV1.query(1);

        /* 
         * Why not just do like this? 
         */
        OurPrice sorterV2 = new OurPrice();
        sorterV2.query(2);
    }
Run Code Online (Sandbox Code Playgroud)

java

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

将迭代函数转换为递归

java version "1.8.0_92"
Run Code Online (Sandbox Code Playgroud)

嗨,

我试图将这个使用迭代的函数转换为递归函数.

  public static String bitConversion(int x) {
        List<Integer> binaryList = new ArrayList<Integer>();

        while(x > 0) {
            binaryList.add(x % 2);
            x /= 2;
        }

        StringBuilder stringBuilder = new StringBuilder();
        for(Integer binary : binaryList) {
            stringBuilder.append(binary.toString());
        }

        return stringBuilder.toString();
    }
Run Code Online (Sandbox Code Playgroud)

我的尝试是这样的

  public static String bitConversion(int x) {
        List<Integer> binaryList = new ArrayList<Integer>();

        if(x <= 0) {
            StringBuilder stringBuilder = new StringBuilder();
            for(Integer binary : binaryList) {
                stringBuilder.append(binary.toString());
            }

            return stringBuilder.toString();
        }
        else {
            binaryList.add(x % 2);
            return bitConvert(x …
Run Code Online (Sandbox Code Playgroud)

java recursion

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

在 Kotlin 中使用伴生对象返回类的实例

Android Studio 3.0 RC2
Kolin 1.1.51
Run Code Online (Sandbox Code Playgroud)

我创建了一个 Android 应用程序,我想返回扩展 Application 的类的实例,并访问与在 Java 中使用 static 所做的等效操作。

class BusbyMoviesMainApplication : Application() {
    companion object {
        private val instance: BusbyMoviesMainApplication = BusbyMoviesMainApplication()

        @JvmStatic
        fun getBusbyInstance(): BusbyMoviesMainApplication {
            return instance
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在像这样访问它。但是,getCacheDir 返回 null

BusbyMoviesMainApplication.getBusbyInstance().getCacheDir()
Run Code Online (Sandbox Code Playgroud)

我看不出我做错了什么。

在 Java 中我以前做过这样的事情,它有效,我试图在 Kotlin 中做同样的事情:

public class BusbyMoviesApplication extends Application {
    private static BusbyMoviesApplication mBusbyMoviesApplication;

    public static BusbyMoviesApplication getInstance() {
        return mBusbyMoviesApplication;
    }

    @Override
    public void onCreate() {
        super.onCreate();

        mBusbyMoviesApplication = BusbyMoviesApplication.this;
    }
}
Run Code Online (Sandbox Code Playgroud)

java android kotlin

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

使用 map 函数转换列表中的项目

Kotlin 1.4.21
Run Code Online (Sandbox Code Playgroud)

我有一个产品列表,我想将价格转换为格式化的字符串。但是,价格不会更改为格式化的价格。

IE

orginal price: 1658

expected: "1,658.00"

actual: 1658
Run Code Online (Sandbox Code Playgroud)

这是类结构

data class Product(
    val productName: String,
    val price: Double)
Run Code Online (Sandbox Code Playgroud)

在这里,我正在使用我的项目列表,我想改变价格。

listOfProjects.map {
    it.price.toAmount(2) // extension function that formats to 2 decimal places and converts to a string
}

if (listOfProjects.isNotEmpty()) {
    // Do something with the list. However, the price hasn't changed
}
Run Code Online (Sandbox Code Playgroud)

kotlin

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

malloc没有分配正确的字节数

gcc(GCC)4.7.0 c89

我使用以下内容分配内存:

db_data_size = 32;
db->db_data[i]->name = malloc(db_data_size);

(gdb) p db_data_size
$24 = 32
(gdb) p sizeof(db->db_data[i]->name)
$25 = 8
(gdb) n
205   db->db_data[i]->email = malloc(db_data_size);
(gdb) p sizeof(db->db_data[i]->name)
$26 = 8
Run Code Online (Sandbox Code Playgroud)

在调试器中,我得到8个字节而不是我认为应该分配的32个字节.

我的结构是:

struct data {
    int id;
    int set;
    char *name;
    char *email;
};

struct database {
    struct data **db_data;
    size_t database_rows;
    size_t database_data_size;
};
Run Code Online (Sandbox Code Playgroud)

我能想到的唯一想法是char*是8个字节,这就是我得到的.但是,在malloc中我明确要求32个字节.

c malloc

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

当包含类是单例模式时,使用合成创建许多对象

java version 1.7.0_65
Run Code Online (Sandbox Code Playgroud)

我有一个单例设计模式类.这将始终返回最初创建的同一实例.

但是,我遇到的问题是这个类需要从另一个类创建许多其他对象.我已经使用了这个组合(POI类的实例ArlabFacade).从这个单例实例中,客户端应该能够创建许多POI对象.而且我不想公开POI类的内部工作,一切都必须通过单例实例.

private static ArlabFacade mArlabFacade = null;
private POI mPoi; /* Should be able to create many object of this class */

private ArlabFacade(Context context) {     
        /* initialize properties */
        mContext = context;

        mPoi = null;
    }

public static ArlabFacade getInstance(Context context) {

        /* Create a synchronised singleton instance */
        ReentrantLock lock = new ReentrantLock();
        lock.lock();
        if(mArlabFacade == null) {
            mArlabFacade = new ArlabFacade(context);
        }
        lock.unlock();

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

我尝试过做这样的事情,但它有两个问题.

1) I …
Run Code Online (Sandbox Code Playgroud)

java singleton single-instance object-composition

-2
推荐指数
2
解决办法
1279
查看次数