diff --git a/hw/grlib.h b/hw/grlib.h
index e1c4137..2e9742c 100644
--- a/hw/grlib.h
+++ b/hw/grlib.h
@@ -56,6 +56,7 @@ DeviceState *grlib_irqmp_create(target_phys_addr_t   base,
     qdev_prop_set_ptr(dev, "set_pil_in_opaque", env);
 
     if (qdev_init(dev)) {
+        qdev_free(dev);
         return NULL;
     }
 
@@ -88,6 +89,7 @@ DeviceState *grlib_gptimer_create(target_phys_addr_t  base,
     qdev_prop_set_uint32(dev, "irq-line", base_irq);
 
     if (qdev_init(dev)) {
+        qdev_free(dev);
         return NULL;
     }
 
@@ -113,6 +115,7 @@ DeviceState *grlib_apbuart_create(target_phys_addr_t  base,
     qdev_prop_set_chr(dev, "chrdev", serial);
 
     if (qdev_init(dev)) {
+        qdev_free(dev);
         return NULL;
     }
 
diff --git a/hw/ide/isa.c b/hw/ide/isa.c
index 8ab2718..0efaedb 100644
--- a/hw/ide/isa.c
+++ b/hw/ide/isa.c
@@ -83,9 +83,10 @@ ISADevice *isa_ide_init(ISABus *bus, int iobase, int iobase2, int isairq,
     qdev_prop_set_uint32(&dev->qdev, "iobase",  iobase);
     qdev_prop_set_uint32(&dev->qdev, "iobase2", iobase2);
     qdev_prop_set_uint32(&dev->qdev, "irq",     isairq);
-    if (qdev_init(&dev->qdev) < 0)
+    if (qdev_init(&dev->qdev) < 0) {
+        qdev_free(&dev->qdev);
         return NULL;
-
+    }
     s = DO_UPCAST(ISAIDEState, dev, dev);
     if (hd0)
         ide_create_drive(&s->bus, 0, hd0);
diff --git a/hw/pc.h b/hw/pc.h
index 74d3369..e378821 100644
--- a/hw/pc.h
+++ b/hw/pc.h
@@ -32,6 +32,7 @@ static inline bool serial_isa_init(ISABus *bus, int index,
     qdev_prop_set_uint32(&dev->qdev, "index", index);
     qdev_prop_set_chr(&dev->qdev, "chardev", chr);
     if (qdev_init(&dev->qdev) < 0) {
+        qdev_free(&dev->qdev);
         return false;
     }
     return true;
@@ -51,6 +52,7 @@ static inline bool parallel_init(ISABus *bus, int index, CharDriverState *chr)
     qdev_prop_set_uint32(&dev->qdev, "index", index);
     qdev_prop_set_chr(&dev->qdev, "chardev", chr);
     if (qdev_init(&dev->qdev) < 0) {
+        qdev_free(&dev->qdev);
         return false;
     }
     return true;
diff --git a/hw/pci-hotplug.c b/hw/pci-hotplug.c
index 61257f4..16fecd1 100644
--- a/hw/pci-hotplug.c
+++ b/hw/pci-hotplug.c
@@ -192,8 +192,10 @@ static PCIDevice *qemu_pci_hot_add_storage(Monitor *mon,
     switch (type) {
     case IF_SCSI:
         dev = pci_create(bus, devfn, "lsi53c895a");
-        if (qdev_init(&dev->qdev) < 0)
+        if (qdev_init(&dev->qdev) < 0)   {
+            qdev_free(&dev->qdev);
             dev = NULL;
+        }
         if (dev && dinfo) {
             if (scsi_hot_add(mon, &dev->qdev, dinfo, 0) != 0) {
                 qdev_unplug(&dev->qdev, NULL);
@@ -212,8 +214,10 @@ static PCIDevice *qemu_pci_hot_add_storage(Monitor *mon,
             dev = NULL;
             break;
         }
-        if (qdev_init(&dev->qdev) < 0)
+        if (qdev_init(&dev->qdev) < 0)  {
+            qdev_free(&dev->qdev);
             dev = NULL;
+        }
         break;
     default:
         dev = NULL;
diff --git a/hw/pci.c b/hw/pci.c
index c1ebdde..53cc60b 100644
--- a/hw/pci.c
+++ b/hw/pci.c
@@ -1390,8 +1390,10 @@ PCIDevice *pci_nic_init(NICInfo *nd, const char *default_model,
     pci_dev = pci_create(bus, devfn, pci_nic_names[i]);
     dev = &pci_dev->qdev;
     qdev_set_nic_properties(dev, nd);
-    if (qdev_init(dev) < 0)
+    if (qdev_init(dev) < 0) {
+        qdev_free(dev);
         return NULL;
+    }
     return pci_dev;
 }
 
diff --git a/hw/qdev-monitor.c b/hw/qdev-monitor.c
index b01ef06..3f940cf 100644
--- a/hw/qdev-monitor.c
+++ b/hw/qdev-monitor.c
@@ -470,6 +470,7 @@ DeviceState *qdev_device_add(QemuOpts *opts)
         g_free(name);
     }        
     if (qdev_init(qdev) < 0) {
+        qdev_free(qdev);
         qerror_report(QERR_DEVICE_INIT_FAILED, driver);
         return NULL;
     }
diff --git a/hw/qdev.c b/hw/qdev.c
index 6a8f6bd..d2dc28b 100644
--- a/hw/qdev.c
+++ b/hw/qdev.c
@@ -139,7 +139,7 @@ DeviceState *qdev_try_create(BusState *bus, const char *type)
 /* Initialize a device.  Device properties should be set before calling
    this function.  IRQs and MMIO regions should be connected/mapped after
    calling this function.
-   On failure, destroy the device and return negative value.
+   On failure, return a negative value.
    Return 0 on success.  */
 int qdev_init(DeviceState *dev)
 {
@@ -150,7 +150,6 @@ int qdev_init(DeviceState *dev)
 
     rc = dc->init(dev);
     if (rc < 0) {
-        qdev_free(dev);
         return rc;
     }
 
diff --git a/hw/scsi-bus.c b/hw/scsi-bus.c
index f10f3ec..2b738b0 100644
--- a/hw/scsi-bus.c
+++ b/hw/scsi-bus.c
@@ -212,8 +212,10 @@ SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockDriverState *bdrv,
         qdev_free(dev);
         return NULL;
     }
-    if (qdev_init(dev) < 0)
+    if (qdev_init(dev) < 0) {
+        qdev_free(dev);
         return NULL;
+    }
     return SCSI_DEVICE(dev);
 }
 
diff --git a/hw/usb/bus.c b/hw/usb/bus.c
index 2068640..1b0a1cc 100644
--- a/hw/usb/bus.c
+++ b/hw/usb/bus.c
@@ -242,6 +242,7 @@ USBDevice *usb_create_simple(USBBus *bus, const char *name)
     }
     rc = qdev_init(&dev->qdev);
     if (rc < 0) {
+        qdev_free(&dev->qdev);
         error_report("Failed to initialize USB device '%s'", name);
         return NULL;
     }
diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c
index a96c0b9..cf0addb 100644
--- a/hw/usb/dev-storage.c
+++ b/hw/usb/dev-storage.c
@@ -623,9 +623,10 @@ static USBDevice *usb_msd_init(USBBus *bus, const char *filename)
         qdev_free(&dev->qdev);
         return NULL;
     }
-    if (qdev_init(&dev->qdev) < 0)
+    if (qdev_init(&dev->qdev) < 0) {
+        qdev_free(&dev->qdev);
         return NULL;
-
+    }
     return dev;
 }
 
